別問爲什麼爬它,問就是佛。
總結放前面:
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!