别问为什么爬它,问就是佛。
总结放前面:
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!