吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 2086|回复: 14
收起左侧

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

[复制链接]
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,试了试,果然成功了效果如下

3.png 4.png
代码首先是引入需要的库
[Python] 纯文本查看 复制代码
import requests
from  bs4 import BeautifulSoup
import time
import random
之后设置要访问的第一个网页,这里就是菜根谭的目录页
[Asm] 纯文本查看 复制代码
url='https://www.shicimingjv.com/bookindex/27.html'
然后就是设置多个U-A然后随机切换
[Python] 纯文本查看 复制代码
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对象,并将爬取到的网页源码给他
[Python] 纯文本查看 复制代码
page_text=requests.get(url=url,headers=headers).text       
    soup=BeautifulSoup(page_text,'lxml')
然后在浏览器控制台对章节的名称及储存的网址进行解析 1.png
[Asm] 纯文本查看 复制代码
li_list=soup.select('.book > ul > li')
之后对每个章节再次发送请求,实例化soup对象,并在控制台进行内容的解析. 2.png
完整代码及注释如下
[Python] 纯文本查看 复制代码
import requests
from  bs4 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) 
本代码仅供学习交流最后爬取出的文件就不放出来了,想获得的朋友可以自己动手操作一下

免费评分

参与人数 7吾爱币 +7 热心值 +6 收起 理由
ukonw3477 + 2 + 1 用心讨论,共获提升!
搬砖孩子要毕业 + 1 + 1 谢谢@Thanks!
安道尔的鱼 + 1 + 1 热心回复!
魔道书生 + 2 我很赞同!
17798 + 1 我很赞同!
ncu.xxy + 1 我很赞同!
sysonee + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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
初学看这个正好
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2022-6-30 18:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表