从网页抓取数据(的请求获取数据的方式GET,POST请求数据必须构建请求头才可以。)

优采云 发布时间: 2021-11-14 13:03

  从网页抓取数据(的请求获取数据的方式GET,POST请求数据必须构建请求头才可以。)

  POST请求获取数据的方式与GET不同,POST请求数据必须构造请求头。

  Form Data中的请求参数如图15所示:

  

  图片

  图 15

  复制它并构建一个新字典:

  from_data={'i':'我爱中国','from':'zh-CHS','to':'en','smartresult':'dict','client':'fanyideskweb','salt' :'258','sign':'b3589f32c38bc9e3876a570b8a992604','ts':'25','bv':'b33a2f3f9d09bde064c9275bcb33d94e,'@1','版本'keyfrom':'fanyi.web','action':'FY_BY_REALTIME','typoResult':'false'}

  接下来使用requests.post方法请求表单数据,代码如下:

  导入请求#导入请求包

  响应 = requests.post(url,data=payload)

  将字符串格式的数据转换为JSON格式的数据,根据数据结构提取数据,并打印出翻译结果。代码如下:

  导入 jsoncontent = json.loads(response.text)print(content['translateResult'][0][0]['tgt'])

  使用requests.post方法抓取有道翻译结果的完整代码如下:

  import requests#import requests package import jsondef get_translate_date(word=None):url =';smartresult=rule'From_data=('i':word,'from':'zh-CHS','to':'en', 'smartresult':'dict','client':'fanyideskweb','salt':'258','sign':'b3589f32c38bc9e3876a570b8a992604','ts':'25','bv':'b39604b3d2f' :'json','version':'2.1','keyfrom':'fanyi.web','action':'FY_BY_REALTIME','typoResult':'false'} 请求表单数据 response = requests .post(url,data=From_data) 将 Json 格式字符串转换为字典 content = json.loads(response.text) print(content) 打印翻译后的数据 print(content['translateResult'][0][0] ['tgt'])if name=='main':get_translate_date('我爱中国')

  使用 Beautiful Soup 解析网页

  网页的源代码已经可以通过requests库捕获,下一步就是从源代码中查找并提取数据。Beautiful Soup 是一个 Python 库,其主要功能是从网页中抓取数据。Beautiful Soup 已经移植到 bs4 库中,这意味着您需要在导入 Beautiful Soup 之前安装 bs4 库。

  bs4库的安装方式如图16所示:

  

  图片

  图 16

  安装完bs4库后,还需要安装lxml库。如果我们不安装 lxml 库,我们将使用 Python 的默认解析器。虽然 Beautiful Soup 既支持 Python 标准库中的 HTML 解析器,也支持一些第三方解析器,但 lxml 库更强大,速度更快。因此,我建议安装 lxml 库。

  安装好Python第三方库后,输入以下代码,开启Beautiful Soup之旅:

  import requests#import requests from bs4 import BeautifulSoupurl=``strhtml=requests.get(url)soup=BeautifulSoup(strhtml.text,'lxml')data = soup.select('#main>div>div.mtop.firstMod .clearfix>div.centerBox>ul.newsList>li>a')print(data)

  代码执行结果如图 17 所示。

  

  图片

  图17(点此查看高清大图)

  Beautiful Soup 库可以轻松解析网页信息。它集成在 bs4 库中,需要时可以从 bs4 库中调用。表达语句如下:

  从 bs4 导入 BeautifulSoup

  首先将HTML文档转换成Unicode编码格式,然后Beautiful Soup选择最合适的解析器来解析这个文档,这里是指定解析的lxml解析器。解析后,将复杂的 HTML 文档转换为树状结构,每个节点都是一个 Python 对象。这里,解析后的文档存放在新创建的变量soup中,代码如下:

  汤=BeautifulSoup(strhtml.text,'lxml')

  接下来,使用select(选择器)定位数据。定位数据时,需要使用浏览器的开发者模式。将鼠标光标放在对应的数据位置上单击鼠标右键,然后在快捷菜单中选择“检查”命令,如图18所示。如图:

  

  图片

  图 18

  然后浏览器右侧会弹出开发者界面,右侧高亮代码(见图19(b))对应左侧高亮数据文本(见图19(a))。右击右侧高亮显示的数据,在弹出的快捷菜单中选择“复制”➔“复制选择器”命令,自动复制路径。

  

  图片

  图 19 复制路径

  在文档中粘贴路径,代码如下:

  main> div> div.mtop.firstMod.clearfix> div.centerBox> ul.newsList> li:nth-child(1)> a

  由于这条路径是第一个选择的路径,我们需要获取所有的标题,删除li:nth-child(1),代码如下:

  main> div> div.mtop.firstMod.clearfix> div.centerBox> ul.newsList> li> a

  使用soup.select引用这个路径,代码如下:

  data = soup.select('#main> div> div.mtop.firstMod.clearfix> div.centerBox> ul.newsList> li> a')

  清理和组织数据

  至此,获得了一段目标HTML代码,但尚未提取数据。接下来,在 PyCharm 中输入以下代码:

  对于数据中的项目:result={'title':item.get_text(),'link':item.get('href')}print(result)

  代码运行结果如图20所示:

  

  图片

  图20

  首先,很明显,要提取的数据是标题和链接。标题在 <a> 标签中,标签的主体是使用 get_text() 方法提取的。该链接位于 <a> 标记的 href 属性中。使用 get() 方法提取标签中的 href 属性。括号中指定要提取的属性数据,即get('href')。

  从图20可以发现文章的链接中有一个数字ID。接下来,使用正则表达式提取此 ID。需要用到的正则符号如下:

  \d 匹配数字

  +匹配前一个字符1次或多次

  在 Python 中调用正则表达式时,请使用 re 库。这个库不需要安装,直接调用即可。在 PyCharm 中输入以下代码:

  import refor item in data:result={"title":item.get_text(),"link":item.get('href'),'ID':re.findall('\d+',item.get(' href'))}打印(结果)

  运行结果如图21所示:

  

  图片

  图 21

  这里使用的是re库的findall方法,第一个参数代表正则表达式,第二个参数代表要提取的文本。

  爬行动物攻击与防御

  爬虫模拟人们的浏览和访问行为,对数据进行批量爬取。当捕获的数据量逐渐增加时,会对被访问的服务器造成很大的压力,甚至可能会崩溃。换句话说,服务器不喜欢有人爬取自己的数据。然后,网站 会对这些爬虫采取一些反爬的策略。

  服务器识别爬虫的第一种方式是通过检查连接的用户代理来识别是浏览器访问还是代码访问。在代码访问的情况下,当访问量增加时,服务器会直接阻塞访问IP。

  那么我们应该采取什么措施来应对这种初级防攀爬机制呢?

  以之前创建的爬虫为例。在访问的时候,我们不仅可以在开发者环境中找到URL和Form Data,还可以在Request headers中构造浏览器的请求头来封装自己。服务器识别浏览器访问的方法是判断Request headers下的关键字是否为User-Agent,如图22所示。

  

  图片

  图 22

  因此,我们只需要构造这个请求头的参数即可。只需创建请求头信息,代码如下:

  headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}

  响应 = request.get(url,headers=headers)

  说到这里,很多读者会觉得修改User-Agent太简单了。真的很简单,但是正常人一秒看一张图片,爬虫可以一秒抓取多张图片。比如一个爬虫一秒能抓取上百张图片,对服务器的压力必然会增加。也就是说,如果你在一个IP下批量访问和下载图片,这种行为不符合正常人的行为,IP必须被屏蔽。

  原理也很简单。就是统计每个IP的访问频率。如果频率超过阈值,将返回验证码。如果确实是用户访问,则用户填写并继续访问。如果是代码访问,会被封IP。

  这个问题有两种解决方案。第一个是常用的附加延迟,每3秒捕获一次。代码如下:

  导入时间

  time.sleep(3)

  但是,我们的爬虫的目的是高效地批量捕获数据。在这里,如果我们设置每3秒爬一次,效率太低了。其实还有一个更重要的解决办法,就是从本质上解决问题。最后,如果你的时间不是很紧,想快速提高,最重要的是你不怕吃苦。建议你联系魏:762459510,真的很好。很多人都在快速进步。你需要害怕困难。!可以去加进去看看~

  不管怎么访问,服务器的目的就是找出哪个是代码访问,然后屏蔽IP。解决方法:为了避免IP被封,数据采集时经常使用代理。当然,请求也有相应的代理属性。

  首先建立自己的代理IP池,以字典的形式分配给代理,然后传递给请求。代码如下:

  proxies={"http":":3128","https":":1080",}response = requests.get(url, proxies=proxies)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线