前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫练习题(二)

爬虫练习题(二)

作者头像
设计者
发布2022-12-20 13:14:24
6740
发布2022-12-20 13:14:24
举报
爬虫练习题(二)
爬虫练习题(二)

Don't just follow the path .Make your own trail .不要只是沿着路走,走你自己的路。

这次发稿具有极强的纪念意义,生日当天发稿,开启了我网络笔记的生涯,以及加深了对爬虫的无限热爱,希望大家能够给予我支持!!!第一次发稿还请多多支持!!!以后精彩不断哦。

10.(选做题 1)目标网站https://www.sogou.com/要求:1.用户输入要搜索的内容,起始页和终止页 2.根据用户输入的内容爬取相关页面的源码 3.把获取下来的数据保存到本地

代码语言:javascript
复制
import requestsword = input("请输入搜索内容")start = int(input("请输入起始页"))end = int(input("请输入结束页"))headers = {    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44'}for n in range(start, end + 1):    url = f'https://www.sogou.com/web?query={word}&page={n}'    # print(url)    response = requests.get(url, headers=headers)    with open(f'{word}的第{n}页。html', "w", encoding="utf-8")as file:        file.write(response.content.decode("utf-8"))

一、分析网页

1.先录入网址

python - 搜狗搜索 (sogou.com)https://www.sogou.com/web?query=python&_ast=1650447467&_asf=www.sogou.com&w=01029901&p=40040100&dp=1&cid=&s_from=result_up&sut=7606&sst0=1650447682406&lkt=0%2C0%2C0&sugsuv=1650427656976942&sugtime=1650447682406 2.分别搜索 “Python”,“中国”并进行网址对比。

中国 - 搜狗搜索 (sogou.com)https://www.sogou.com/web?query=

3.把每个参数以"&"符分割开来

结论:(1)参数 query 是搜索对象,中文字符会进行转义(转义后编码不用记忆)

(2)参数 ie 是转义的编码类型,以"utf-8"为例,该参数可以在 Network- Payload-ie=utf-8,有些包也可以在 Network-Response-charset='utf-8',如图:

4.但是有这俩个参数还不能满足试题的翻页爬取需求,所以我们要手动翻页再进行检查

代码语言:javascript
复制
https://www.sogou.com/web?query=python&page=2&ie=utf8

5.终于到了最关键的时刻了!我们找到了规律,以及重要参数的含义,就可以构建通用的 URL 了,如图:

代码语言:javascript
复制
url = f'https://www.sogou.com/web?query={word}&page={n}'

用变量把可变参数赋值,这样就构建好了一个新的 URL

二、找参数

代码语言:javascript
复制
https://www.sogou.com/web?query=Python&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sut=12736&sst0=1650428312860&lkt=0%2C0%2C0&sugsuv=1650427656976942&sugtime=1650428312860https://www.sogou.com/web?query=java&_ast=1650428313&_asf=www.sogou.com&w=01029901&p=40040100&dp=1&cid=&s_from=result_up&sut=10734&sst0=1650428363389&lkt=0%2C0%2C0&sugsuv=1650427656976942&sugtime=1650428363389https://www.sogou.com/web?query=C%E8%AF%AD%E8%A8%80&_ast=1650428364&_asf=www.sogou.com&w=01029901&p=40040100&dp=1&cid=&s_from=result_up&sut=11662&sst0=1650428406805&lkt=0%2C0%2C0&sugsuv=1650427656976942&sugtime=1650428406805https://www.sogou.com/web?https://www.sogou.com/web?query=Python&https://www.sogou.com/web?query=Python&page=2&ie=utf8  'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44''cookie' = "IPLOC=CN3600; SUID=191166B6364A910A00000000625F8708; SUV=1650427656976942; browerV=3; osV=1; ABTEST=0|1650428297|v17; SNUID=636A1DCD7B7EA775332A80CB7B347D43; sst0=663; ld=llllllllll2AgcuYlllllpJK6jclllllHuYSpyllllDlllllVllll5@@@@@@@@@@; LSTMV=229,37; LCLKINT=1424"'URl' = "https://www.sogou.com/web?query=Python&_ast=1650429998&_asf=www.sogou.com&w=01029901&cid=&s_from=result_up&sut=5547&sst0=1650430005573&lkt=0,0,0&sugsuv=1650427656976942&sugtime=1650430005573"url="https://www.sogou.com/web?query={}&page={}:

UA 要以字典形式被 headers 接收

1.headers 的错误:

代码语言:javascript
复制
" ":" ",      # 构建字典的格式,','千万千万别忘了# headers是关键字不能写错了,写错的话就会有如下报错  import requestsurl = "https://www.bxwxorg.com/"hearders = {    'cookie':'Hm_lvt_46329db612a10d9ae3a668a40c152e0e=1650361322; mc_user={"id":"20812","name":"20220415","avatar":"0","pass":"2a5552bf13f8fa04f5ea26d15699233e","time":1650363349}; Hm_lpvt_46329db612a10d9ae3a668a40c152e0e=1650363378',    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44'}response = requests.get(url, hearders=hearders)print(response.content.decode("UTF-8"))  Traceback (most recent call last):  File "D:/pythonproject/第二次作业.py", line 141, in <module>    response = requests.get(url, hearders=hearders)  File "D:\python37\lib\site-packages\requests\api.py", line 75, in get    return request('get', url, params=params, **kwargs)  File "D:\python37\lib\site-packages\requests\api.py", line 61, in request    return session.request(method=method, url=url, **kwargs)TypeError: request() got an unexpected keyword argument 'hearders' # 原因:三个hearders写的一致,但是headers是关键字,所以报类型错误    # 但是写成heades会有另一种报错形式 import requestsword = input("请输入搜索内容")start = int(input("请输入起始页"))end = int(input("请输入结束页"))heades = {    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44'}for n in range(start, end + 1):    url = f'https://www.sogou.com/web?query={word}&page={n}'    # print(url)    response = requests.get(url, headers=headers)    with open(f'{word}的第{n}页。html', "w", encoding="utf-8")as file:        file.write(response.content.decode("utf-8"))  Traceback (most recent call last):  File "D:/pythonproject/第二次作业.py", line 117, in <module>    response = requests.get(url, headers=headers)NameError: name 'headers' is not defined # 原因:三个hearders写的不一致,所以报名称错误    # 正确写法是,最好不要写错! import requestsurl = "https://www.bxwxorg.com/"headers = {    'cookie':'Hm_lvt_46329db612a10d9ae3a668a40c152e0e=1650361322; mc_user={"id":"20812","name":"20220415","avatar":"0","pass":"2a5552bf13f8fa04f5ea26d15699233e","time":1650363349}; Hm_lpvt_46329db612a10d9ae3a668a40c152e0e=1650363378',    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44'}response = requests.get(url, headers=headers)print(response.content.decode("UTF-8"))

三、循环

代码语言:javascript
复制
for n in range(start, end + 1):

为什么是'end+1'呢:因为 range 函数的范围区间是左闭右开的所以真实的 end 值取不到,在后面加 1 就可以取到前一个真实值了

因为是翻页爬取,需要用到每一页的 URL,所以要把构建的 URL 调入循环中

四、requests 的基本介绍:(江湖人称 "urllib3" )

1.安装:Win + R --> cmd -->输入 pip install requests

# 下载后如果不能调用是因为:模块安装在 Python 自带的环境中,自己用的虚拟环境没有这 个库,要指定环境

# 指定环境 : 终端输入 where python 找到安装路径 --> File --> setting --> project --> project interpreter --> 找到设置图标齿轮 --> Add --> system interpreter --> ... --> (where python 中的路径) --> OK --> Apply 应用 --> OK

2.爬虫的请求模块 urllib.request 模块 (urllib3)

(1)常用方法:

urllib.request.urlopen("网址")

作用:向网站发起一次请求,并获取相应

字节流 = response.read().decode('utf-8')

urllib.request request("网址", headers="字典")

# 因为 urlopen() 不支持重构 User-Agent

(2)requests 模块

(2-1)request 的常用用法:

requsts.get(网址)

(2-2)响应的对象 response 的方法:

response.text 返回 Unicode 格式的数据(str)

response.content 返回字节流数据(二进制)

response.conten.decode('utf-8')手动进行解码

response.url 返回 url

response.encode() = "编码"

(3).通过 requsts 模块发送 POST 请求:

cookie: cookie 是通过在客户端记录的信息确定用户身份

HTTP 是一种连接协议客户端和服务器交互仅仅限于“请求/响应”结束后断开,下一次请 求时,服务器会认为是一个新的客户端,为了维护他们之间的连接,让服务器知道这是前一个用户发起的请求,必须在一个地方保存客户端信息

session; session 是通过在服务端记录的信息确定用户身份,这里的 session 就指的是一次会话

这样就可以获取页面源码了!!!

不要着急,最好的总会在最不经意的时候出现。那我们要做的就是:怀揣希望去努力,静待美好的出现。愿你的世界永远充满阳光,不会有多余的悲伤。愿你在人生道路上,到达心之所向的地方,陪伴你的,是你最欢喜的模样。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用变量把可变参数赋值,这样就构建好了一个新的 URL
  • UA 要以字典形式被 headers 接收
  • 为什么是'end+1'呢:因为 range 函数的范围区间是左闭右开的所以真实的 end 值取不到,在后面加 1 就可以取到前一个真实值了
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档