python 爬取句子迷,多好的一個網站(哭~~)

 別問爲什麼爬它,問就是佛。

總結放前面:

 1、電腦客戶端被針對的情況,將瀏覽器改爲手機瀏覽器

2、IP被封有點煩,暫時用校園網和寬帶頂着(相當於兩個IP)

3、多線程加鎖保護文件保存和讀取。

 

這麼好看的句子,當然要爬下來一起分享啦~,其實是想拓展一個私人程序的,哈哈。

 

 來來來,我們F12先看看,多簡單哦,

獲取頁面,然後解析,最後找到我們需要的信息。只放搜尋信息的代碼吧,其他都比較簡單。

msg =BeautifulSoup(html, "lxml")
msg = soup.find_all('a',class_="xlistju")

然後你會發現只有:一半的句子????,而且所有的句子都是,換行的句子都給你少了一部分?????什麼鬼,難道是我打開方式不對?

只截了html的圖,代碼不想改回去了,反正你會發現換行的東西丟了一半.......

難道是和網易雲一樣的加密?不會解密啊........

嘗試獲取句子的頁面,進入爬取?你會發現一個更噁心的東西,每次進獲取html 的句子不同,絕對加密了!(如果沒有,我再多吃幾碗大米.....)

我的寬帶IP由於訪問過多,被封了(GG),服務器返回:403。咋滴,我還有校園網!,哼,槓上了!

換種打開方式看看,我模擬手機瀏覽器打開,看看。谷歌自帶手機瀏覽器打開網頁功能

谷歌瀏覽器爲例子:點擊下面這個圖標,然後刷新網頁就好了。

 

 我們需要找到手機的客戶端信息,看包撒:

我直接複製下來了:

headers = {
        "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) "
                      "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Mobile Safari/537.36",
    }

測試一下,好像並沒有發現什麼不同,該少的還是少了.......,那進入句子的主要網頁呢!

完美,都顯示清楚了,果然手機端沒這麼多煩人的(以爲手機端就不會用爬蟲了,哼~~),我測試了幾遍都沒問題。(訪問了幾千的頁面都沒被禁,電腦客戶端......)

 由於這種方法效率比較低,我大概要爬取300個句子,就要訪問330個頁面,速度慢,開了多線程,保存本地,加了個鎖(學了操作系統還是有用的,哈哈)。還是怕被封,所以把所有的狀態碼都顯示了,以防萬一!

接下來上所有代碼:

# -*- conding:utf-8 -*-
"""
@author:ym
@time:05-2019/5/3-
"""
import threading
import time

import requests
import re
count = 0
flag = 0


def write_txt(msg):

    with open('C:\\****\***\Desktop\\好句子.txt', 'a+', encoding='UTF-8') as f:
        f.write(msg)


def get_the_title(num):
    # 獲得id號 然後通過手機瀏覽器模擬,反爬你個蛇皮,搞的我烏煙瘴氣的。
    global count
    count += 1
    url = "https://m.juzimi.com/ju/" + str(num)
    headers = {
        "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) "
                      "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Mobile Safari/537.36",
    }
    html = requests.get(url=url, headers=headers)
    print("\n"+str(num)+"狀態碼:"+str(html.status_code), end='')
    html = html.content.decode('UTF-8')  # 解碼
    msg = re.findall(r'content="句子欣賞評論:.*?\"', str(html))
    msg = str(msg).replace("content=\"句子欣賞評論:", '').replace("\"", '').\
        replace("[' “", '').replace("”']", '').replace("[' ", '').replace("']", '')
    msg += '\n'
    return msg


def get_good_night(page):
    """
    獲取該頁面的所有鏈接》》id,然後根據get_the_title 獲取具體內容
    一定要用手機瀏覽器的格式,不然會被反爬(正常抓取,顯示不全,還是沒想到辦法解決..)
    :param page:  當前的頁面
    :return: 該頁面爬取到的信息
    """
    # 一共有30頁 》》0-29 ,0則不寫
    global flag  # 併發情況 加鎖
    flag += 1
    url = "https://www.juzimi.com/original/week/?page="+str(page)
    headers = {
        "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) "
                      "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Mobile Safari/537.36",
    }
    html = requests.get(url=url, headers=headers)
    print(str(page)+"頁狀態:"+str(html.status_code), )
    html = html.content.decode('UTF-8')
    msg = re.findall(r"/user/login\?destination=ju/.*?&me=flag\"", html)
    message = ''
    for i in msg:
        i = str(i).replace("/user/login?destination=ju/", '').replace("&me=flag\"", '')
        message += get_the_title(i)
    flag -= 1
    return message


def add_speed(begin, end):
    i = begin
    msg = ''
    while i <= end:
        msg += get_good_night(i)
        i = i + 1
    write_txt(msg)


if __name__ == '__main__':
    threading.Thread(target=add_speed, args=(0, 5)).start()
    threading.Thread(target=add_speed, args=(6, 15)).start()
    threading.Thread(target=add_speed, args=(16, 30)).start()
    while flag:
        time.sleep(1)
    print('一共爬取好句子:'+str(count))
    print("ok\n")

nice!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章