tsu.xxw 发表于 2022-1-16 11:37

初学爬虫爬取古诗文,第一次碰到反爬

本帖最后由 tsu.xxw 于 2022-1-16 11:42 编辑

初次学习爬虫,爬取古诗文名句网站时,碰到了requests.exceptions.ConnectionError: (‘Connection aborted.’, RemoteDisconnected(‘Remote end closed connection without response’,))的错误
经过查询,发现是
1、http的连接数超过最大限制,默认的情况下连接是Keep-alive的,所以这就导致了服务器保持了太多连接而不能再新建连接。
2、ip被封
3 、程序请求速度过快三种可能的远因,
第一种原因就可以pass掉了,
对于第二种,我试了试自己电脑浏览器是可以正常访问的,也pass
对于第三种,我在最后加了一个sleep(),可是仍然提示,
最后,在某sdn中找到个可能解决的方法,随机切换User-Agent,试了试,果然成功了效果如下


代码首先是引入需要的库import requests
frombs4 import BeautifulSoup
import time
import random之后设置要访问的第一个网页,这里就是菜根谭的目录页url='https://www.shicimingjv.com/bookindex/27.html'然后就是设置多个U-A然后随机切换user_agent_list = [
      "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
      "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
      "Mozilla/5.0 (Windows NT 10.0; WOW64) Gecko/20100101 Firefox/61.0",
      "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
      "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
      "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
      "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
      "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
      ]                     
    headers = {'User-Agent': random.choice(user_agent_list)}之后实例化BeaufulSoup对象,并将爬取到的网页源码给他page_text=requests.get(url=url,headers=headers).text      
    soup=BeautifulSoup(page_text,'lxml')然后在浏览器控制台对章节的名称及储存的网址进行解析li_list=soup.select('.book > ul > li')之后对每个章节再次发送请求,实例化soup对象,并在控制台进行内容的解析.
完整代码及注释如下import requests
frombs4 import BeautifulSoup
import time
import random

if __name__ == '__main__':
    url='https://www.shicimingjv.com/bookindex/27.html'
    user_agent_list = [
      "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
      "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
      "Mozilla/5.0 (Windows NT 10.0; WOW64) Gecko/20100101 Firefox/61.0",
      "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
      "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
      "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
      "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
      "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
      ]                     #多用几个请求头,防止网站拒绝,和下面得sleep异曲同工之妙
    headers = {'User-Agent': random.choice(user_agent_list)}
    page_text=requests.get(url=url,headers=headers).text       #对指定页面get请求并将获取的数据text给page_text
    soup=BeautifulSoup(page_text,'lxml')                     #创建一个BeautifulSoup对象,将网页源码加载到该对象中
    li_list=soup.select('.book > ul > li')                     #开始解析标题及url,先将所有的li标签赋给一个列表
    fp=open('./菜根谭.txt','w',encoding='utf-8')
    for li in li_list:                                       #接着对这个列表遍历
      title=li.a.string                                    #利用string将li标签中的标题获取出来
      detail_url=li.a['href']                              #定位到li标签中的href,里面时章节详情页的内容
      detail_page_text=requests.get(url=detail_url,headers=headers).text   #重新对详情页发起请求
      detail_soup=BeautifulSoup(detail_page_text,'lxml')                   #重新实例化soup对象
      div_tage=detail_soup.find('div',class_='entry-content clearfix')   #对详情页解析,找到储存文章的class
      text_content=div_tage.text                                           #直接利用.text将文本都获取
      fp.write(title+':'+text_content+'/n')                              #将获取的文本内容写入文件储存并换行
      print(title+'下载完成')
      time.sleep(6) 本代码仅供学习交流最后爬取出的文件就不放出来了,想获得的朋友可以自己动手操作一下

17798 发表于 2022-1-16 12:30

lz 浏览器控制台那需要用到正则是嘛

tsu.xxw 发表于 2022-1-17 19:48

ukonw3477 发表于 2022-1-17 17:05
有没有推荐的教程,分享下

https://www.bilibili.com/video/BV1Z64y1h7Rk?p=87&spm_id_from=333.1007.top_right_bar_window_history.content.click
在b站看的,老师讲的很好

Shikure 发表于 2022-1-16 11:45

sleep的间隔可以多一点点,或者是请求一次就sleep一下

tsu.xxw 发表于 2022-1-16 12:53

17798 发表于 2022-1-16 12:30
lz 浏览器控制台那需要用到正则是嘛

这个并没有用到正则,用的是BeautifulSoup库

我爱吃大蒜 发表于 2022-1-16 15:54

厉害了 学习爬虫

vtor 发表于 2022-1-16 16:09

requests.get之后,执行一次requests.close
就不会被封了

arg10 发表于 2022-1-16 16:35

厉害,但是看不懂

幽溪左畔 发表于 2022-1-16 18:51


s = requests.session()
for _ in range(x):
      s.post(......
这样写效率提高不少

幻梦云溪 发表于 2022-1-16 19:58

学习一下

sk1984 发表于 2022-1-16 20:33

初学看这个正好
页: [1] 2
查看完整版本: 初学爬虫爬取古诗文,第一次碰到反爬