网页访客qq抓取(如何获得我们getContent函数中的那些需要使用的headers参数)
优采云 发布时间: 2021-09-21 12:14网页访客qq抓取(如何获得我们getContent函数中的那些需要使用的headers参数)
urllib.error.HTTPError:HTTP错误403:禁止
从403禁止,我们可以发现程序访问被网站禁止,因为csdn网站已设置防爬虫机制。当检测到网站a爬虫时,访问将被拒绝,因此我们将得到上述结果
此时,我们需要模拟浏览器进行访问,以避免网站的反爬虫机制,顺利抓取我们想要的内容
接下来,我们将使用一个神奇的库urlib.request.request进行模拟工作。这一次,我们还将首先添加代码,然后对其进行解释。但是,这一次,我想提醒您,以下代码不能直接使用。我们需要在其中使用my\uHeader中的用户代理被它自己的替换。为了保密,我加了一个省略号,所以不能直接使用。更换方法见下图。这一次,为了方便起见,我们引入了以下功能:
#coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/")
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/article/details/51251757"
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
使用上述代码,我们通常可以捕获此页面的信息。让我们介绍一下如何获取需要在getcontent函数中使用的标题中的参数
由于我们想要模拟浏览器进行web访问,这些参数自然需要我们在浏览器中查找
首先,我们单击进入要爬网的页面,然后右键单击该页面,单击review元素,将出现以下框架。然后我们点击网络,我们会发现我们页面上的信息没有出现。没关系。此时,我们刷新页面,将显示下图所示的信息
此时,我们将在第一行看到51251757,这是我们网站后面的标签。此时,当我们单击此标签时,将显示下图所示的内容:
以下是我直接访问本网站的截图:
对于前两个数字,我曾经编写版本2的Visite,现在我直接使用它们。当时,我在CSDN主页上点击了这个博客,所以在代码和前两个图中,我的标题中的referer被填充
,我用URL链接直接将这张图片输入浏览器,这样我们就可以从图片中看到引用者,这是我们的网站。在这里,我们发布了一张不同的图片,让每个人都更好地理解这个参考。在这张图片中,我用红线标出了要填写的四个内容。当您进行测试时,您不能使用我提供的用户代理,因为我用省略号替换了一些,您应该使用自己的
在这个时候,我们将发现头球是否有明亮的感觉。是的,你的直觉是对的。我们需要的信息在标题中
然后根据代码中需要的参数将信息复制回来,因为这里显示的信息只对应键值,所以复制和使用非常方便
现在让我们介绍一下urllib.request.request的用法(翻译自官方文档):
类urllib。要求请求(URL,data=none,headers={},origin\u req\u host=none,unverifiable=false,method=none)参数:URL:不用说,这是我们将访问的网站。它是一根绳子。数据:数据必须是字节对象,它指定向服务器发送附加数据,如果不需要,则不发送。目前,只有HTTP请求使用数据;当提供数据参数时,HTTP请求应该是post而不是get。数据应以标准的application/x-www-form-urlencoded格式进行缓冲。urllib的参数。作语法分析函数是一个映射或二进制序列,并返回此格式的ascii字符串。当用作数据参数时,应将其编码为字节。头:头是字典数据,当调用add\when header()并具有键和值参数时,此头将作为请求处理。此标头通常用于阻止爬虫访问服务器。浏览器使用头来标识自身,因为某些HTTP服务器只允许来自普通浏览器的请求,而不允许来自脚本(可以理解为爬虫)
例如,Mozilla Firefox浏览器可以将自己识别为“Mozilla/5(X11;u;Linuxi686)Gecko/2008070208 Firefox 20071127/2.0.0.11模块的默认用户代理字符串为“Python urlib/2.6 “ (Python2.6),也就是说,当访问网页时,对于带有反爬虫机制的网站来说,您可以使用此用户代理字符串“Python urlib/”2.6 “ (Python@k266)检查我们是爬虫程序,然后拒绝我们的访问,这就是为什么我们需要用户代理进行更正。在这方面,应该综合考虑网站的反爬虫机制有多严格,因为监视爬虫程序越严格,需要检查的内容就越多,这不可避免地会增加网站)@服务器的处理负担,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。因此,爬虫检测机制越严格越好。还应考虑服务器的负担。Origin_req_host:Origin_req_host应该是t的请求主机原创事务,由RFC2965定义。它默认为http.coo kiejar.request\u host(self)
这是由用户发起的原创请求的主机名或IP地址。例如,如果请求的图像是HTML文档中的图像,则这应该是收录该图像的页面请求的主机。(我们通常不使用此名称,只知道此处)Unverifiable:Unverifiable应指示请求是否无法验证。它由RFC 2965定义,默认值为false。Unverifiable请求表示无法提交用户的网址。例如,当用户在网页的HTML文档中找到图像,但用户没有重试权限时e来自服务器的映像不可验证。值应为true。方法:方法应为指示将使用HTTP请求方法的字符串(如“header”)。如果提供,其值将存储在方法属性中,并通过方法get_Method()调用.子类可以通过在类中设置method属性来指示默认方法。(这很少使用)说了这么多无聊的定义,我无法忍受翻译。让我们回到我们的程序:对于我们的程序,只需要掌握几个要点。首先,我们需要构造请求:req=request(URL)此时,请求为空。我们需要向请求中添加信息。此信息供浏览器查看
Req.add_header(“user agent”,random_header)告诉网页服务器我是通过浏览器访问的,而我不是爬虫。Req.add_header(“get”,URL)告诉浏览器我们访问的网址。Req.add_header(“host”),是网站的信息,我们只是从网站.Req.add_标题(“引用者”、“引用者”)这句话非常重要。它告诉网站服务器我们在哪里找到了我们想要访问的页面。例如,如果你点击百度中的一个链接跳转到你当前访问的页面,那么这个引用就是百度中的链接,这是一种判断机制。你也可以对标题的构造方法这样做:
#coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/")
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/article/details/51251757"
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
正如我们在上面的程序中所看到的,我们也可以直接构造头部,但这样做有一个缺陷,即头部的用户代理已经失效。事实上,我们可以发现,对于访问同一网页的不同计算机主机,我们的其他三个信息:get、host和referer可能是相同的,而此时,只有user-Agent被用来作为判断用户异同的标准,所以问题就来了"从我们周围的学生那里,如果使用一些用户代理,那么模拟多个用户的访问是否更好?事实上,这就是我刚刚开始编写代码的原因,因此有一个我的_头列表。事实上,可以在其中放置多个用户代理,然后通过随机函数随机选择一个进行组合,从而创建一个用户并实现多个-用户访问这种错觉其实很有用。你知道,对于网站,用户的IP访问太多时会被阻止。这并不有趣。因此,要长时间访问网站而不被阻止,还需要很多技能
当我们想要抓取多个网站的网页时,很容易被网站发现,因为一个主机经常访问,然后被阻止。如果我们在列表中放入更多不同的主机号并随机使用,就不容易被发现。当然,为了防止这种情况,更好的方法是使用IP代理,因为我们不知道它是e很容易获得大量主机信息,IP代理也很容易从互联网上搜索。我将在以后的博客中解释多次访问的相关问题,所以我在这里不多说