网页源代码抓取工具( 思考:网站如何来判定是人类正常访问还是爬虫程序访问? )
优采云 发布时间: 2022-03-25 17:06网页源代码抓取工具(
思考:网站如何来判定是人类正常访问还是爬虫程序访问?
)
# 导入模块库(python内置的模块库)
from urllib import request
url = 'https://www.sina.com.cn/'
# 通过request的urlopen方法访问目标网站,获得响应对象
res = request.urlopen(url)
# 使用响应对象的read方法得到网页源代码,但是得到的是bytes格式的,需要用decode方法转成string
html = res.read().decode('utf-8')
print(html)
运行结果:
注意:以上只是运行结果的部分截图;同时得到的response对象的read方法得到的结果是bytes,可以通过decode方法转成string,通过encode可以把string转成bytes格式。
思考:网站如何判断是正常人访问还是爬虫程序访问? ? ?
一段代码解释上述思路
# 导入模块库(python内置的模块库)
from urllib import request
url = 'http://httpbin.org/get'
# 通过request的urlopen方法访问目标网站,获得响应对象
res = request.urlopen(url)
# 使用响应对象的read方法得到网页源代码,但是得到的是bytes格式的,需要用decode方法转成string
html = res.read().decode('utf-8')
print(html)
与之前的代码相比,只有url发生了变化。
我们来看看响应内容:
看到这里,相信思考提出的问题已经得到解答。是的,就是通过请求头来确认是人还是程序访问网站。那么我们如何武装自己呢?不让网站发现我们是python程序怎么样?
是的,让我们从代码开始:
from urllib import request
# 定义常用变量
url = 'http://httpbin.org/get'
headers = {'User-Agent': 'Mozilla/4.0 '}
# 包装请求
req = request.Request(url=url, headers=headers)
# 获取页面响应
res = request.urlopen(req)
# 获得页面源代码
html = res.read().decode('utf-8')
print(html)
我们来看看结果:
从运行结果可以看出,请求头应该是我们修改的。修改后的方法是使用request.Request()
案例一
前面的代码不难,现在来看一个案例。
*敏*感*词*数据采集
要求
1.输入贴吧名称
2.输入起始页
3.输入终止页
4.保存到本地文件:第1页.html、第2页.html ...
案例步骤
1.查找 URL 模式
1.不同吧
对于不同吧,url中kw不同 。
2.不同页
第1页:http://tieba.baidu.com/f?kw=????&pn=0
第2页:http://tieba.baidu.com/f?kw=????&pn=50
第n页:pn=(n-1)*50
对于不同页,参数pn不同
2.获取网页内容
3 保存(本地文件、数据库)
别说了,让我们来看看代码吧! ! !
from urllib import request,parse
import time
import random
class Tieba_Spider():
# 定义常用变量
def __init__(self):
self.url = 'http://tieba.baidu.com/f?kw={}&pn={}'
self.headers = {'User-Agent': 'Mozilla/4.0'}
# 获取页面源代码
def get_page(self, url):
req = request.Request(url=url, headers=self.headers)
res = request.urlopen(req)
html = res.read().decode('utf-8')
return html
# 解析源代码,提取数据
def parse_page(self):
pass
# 保存数据
def write_page(self, filename, html):
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
# 主函数
def main(self):
name = input('请输入你要去的吧名:')
start = int(input('请输入访问的起始页:'))
end = int(input('请输入访问的终止页:'))
kw = parse.quote(name)
for item in range(start, end+1):
url = self.url.format(kw, (item-1)*50)
html = self.get_page(url=url)
filename = '{}-第{}页.html'.format(name, item)
self.write_page(filename=filename, html=html)
print('第{}页下载完成'.format(item))
time.sleep(random.randint(1, 3))
if __name__ == '__main__':
spider = Tieba_Spider()
spider.main()
运行结果: