这个主要是思路方法,不知道为啥锁我,这个哪里涉及版权的问题!!
一.需求及步骤分析
需求:获取,,,,,数据(不写了 免得锁我)
步骤分三部分:1.请求定制 2. 获取响应 3.下载内容
二.分析网页url生成规律
第一页:无规律
第二页:p2
第三页:p3
三.写代码
3.1导入模块(开头)
import urllib.request
3.2 封装函数(放置在最后面)
if __name__ == '__main__':
page_start=int(input("请输入起始页面"))
page_end=int(input("请输入结束页面"))
for page in range(page_start,page_end+1):
create_request(page) # 1.请求定制 传参回传之后 request=create_request(page)
get_content() # 2.获取响应内容 content=get_content(request)
down_load() # 3.下载内容 down_load(page,content)
3.3 请求定制函数方法(更新请求头) 顺着模块往下写
(1)第3.2步的封装函数将page传入,得到def create_request(page):,然后函数可以调用到page参数
(2)return request 将request返回给def create_request(page):, 封装行数的对应部分接收传回来的结果,得到request=create_request(page
def create_request(page):
#1.获取url
if (page=="1"):
url="https://www.dianping.com/shanghai/ch10/g114o3 "
else:
url="https://www.dianping.com/shanghai/ch10/g114o3p"+str(page)
#2.请求对象的定制(反爬虫)
headers={
"User-Agent":"Mozilla/5.0 ×××"
}
request =urllib.request.Request(url=url,headers=headers)
return request
输入print(resquest)检测一下,没有报错
3.4 获取响应内容
(1)获得封装函数的传参content=get_content(request) ,得到def get_content(request):,然后urlopen(request)可以调用
(2)return content 返回给def get_content(request),封装函数接收返回的return ,content=get_content(request)
def get_content(request):
response=urllib.request.urlopen(request)
content=response.read().decode("utf-8")
return content
报错处理!
print(content)验证一下,出现了错误提示urllib.error.HTTPError: HTTP Error 403: Forbidden
原因使网站做了反爬虫机制,上网查了一下,没有找到比较好的答案,因为我已经做了反爬步骤了,还是被挡住了。
尝试:
- 决定用下火狐浏览器(又去下了火狐,哎)_______火狐失败啦!
- 模拟浏览器访问——失败
- 添加更多请求头(重点) a.只家agent—报错 b.只家cookie——不行 c.cookie+referer——不行
正确✔:cookie+referer+user-gent 于是更新前面的请求头
补充:反爬请求头这里应该浏览器里的所有都放进去,但是一般起作用的就是下面这3个,一个一个排查即可
重新print(content) 没有报错
3.5 下载
(1)封装函数down_load(page,content) 参数传给def down_load(page,content):,然后可以调用
def down_load(page,content):
with open("命名_"+str(page)+" .json","w",encoding="utf-8") as fp:
fp.write(content)
运行之后
到这里爬取网页就结束啦!!
4.爬虫重点小结:
- 理清页面url的规律
- 反爬
- 传参
- 报错就去网上检索,然后尝试解决!