网页源代码抓取工具( 思考:网站如何来判定是人类正常访问还是爬虫程序访问? )

优采云 发布时间: 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()

  运行结果:

  

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线