碎碎念:
本文代码参考:Python爬虫小白教程(二)—— 爬取豆瓣评分TOP250电影
完整过程请参考上文,解释得非常清楚,感谢!
本文只在记录编写代码中遇到的问题以及知识点的学习(用啥学啥 (๑•̀ㅂ•́)و✧)
就 你有时候copy代码吧 也不一定能跑出来…
能跑出来吧 也不一定就完全弄懂了每一行代码…
先放上完整代码看看。
# 参考:https://blog.csdn.net/weixin_44547562/article/details/103533502
# 2019.12.16
# ASerendipity_
import time
import requests
from bs4 import BeautifulSoup
# 定义获取页面的函数
def get_page(url, params=None, headers=None):
response = requests.get(url, headers=headers, params=params)
page = BeautifulSoup(response.text, 'lxml')
print(response.url)
print("响应状态码:", response.status_code)
return page
title_list = [] # 电影名列表
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
'Host': 'movie.douban.com'
}
for i in range(11):
params = {"start": (i * 25)}
page = get_page('https://movie.douban.com/top250', params=params, headers=headers)
div_list = page.find_all('div', class_='hd')
for div in div_list:
title = div.a.span.text.strip()
title_list.append(title)
# 每次爬完后休眠1秒钟,防止爬取速度太快被封ip
time.sleep(1)
# print(title_list)
doc = open('Top250Films.txt', 'w')
for i in range(len(title_list)):
print(title_list[i],file=doc)
doc.close()
官方文档真是着实看不下去,找了一篇结构清晰一点的python3 requests详解,内容较完整,可参考。
import requests
def get_page(...)
...
response = requests.get(url, headers=headers, params=params)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
'Host': 'movie.douban.com'
}
for i in range(11):
params = {"start": (i * 25)}
page = get_page('https://movie.douban.com/top250', params=params, headers=headers)
...
requests.get(url, *params, **kwargs)
-url: 需要爬取的网站地址。
-params: 即参数, url中的额外参数,字典或者字节流格式,可选。
-**kwargs : 12个控制访问的参数
拿本篇代码举例
第一页网址:https://movie.douban.com/top250
第二页网址:https://movie.douban.com/top250?start=25
第三页网址:https://movie.douban.com/top250?start=50
… …
最后面start开始的内容就是参数啦。
还加了一个header,主要目的是模拟浏览器来对url发起访问,防止网站的反爬。
官方解释:
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.
功能解释得很精辟了!也可以参考一下这篇python:BeautifulSoup 模块使用指南,从安装到功能介绍和使用,写得都很详细。
这里用到的就是提取网页里的信息。
from bs4 import BeautifulSoup
...
response = requests.get(url, headers=headers, params=params)
page = BeautifulSoup(response.text, 'lxml')
...
response.text ——解析文档
‘lxml’——一种支持的解析器
解析之后的内容就放进 page 里面啦,之后就可以用其查找/修改内容了。比如用page.find_all(…)搜索。
这里除了之前提到过的header,还用到了一个访问页面时的时间间隔1秒,也可以用random设置随机间隔秒数。
这篇文章讲了几个点反爬虫机制和破解方法汇总,摘了一部分下来。
策略1:设置下载延迟,比如数字设置为5秒,越大越安全
策略2:禁止Cookie,某些网站会通过Cookie识别用户身份,禁用后使得服务器无法识别爬虫轨迹
策略3:使用user agent池。也就是每次发送的时候随机从池中选择不一样的浏览器头信息,防止暴露爬虫身份
策略4:使用IP池,这个需要大量的IP资源,可以通过抓取网上免费公开的IP建成自有的IP代理池。
策略5:分布式爬取,这个是针对大型爬虫系统的,实现一个分布式的爬虫,主要为以下几个步骤:
1、基本的http抓取工具,如scrapy;
2、避免重复抓取网页,如Bloom Filter;
3、维护一个所有集群机器能够有效分享的分布式队列;
4、将分布式队列和Scrapy的结合;
5、后续处理,网页析取(如python-goose),存储(如Mongodb)。
策略6:模拟登录—浏览器登录的爬取
设置一个cookie处理对象,它负责将cookie添加到http请求中,并能从http响应中得到cookie,向网站登录页面发送一个请求Request, 包括登录url,POST请求的数据,Http header利用urllib2.urlopen发送请求,接收WEB服务器的Response。
doc = open('Top250Films.txt', 'w')
for i in range(len(title_list)):
print(title_list[i],file=doc)
doc.close()
打开文档-读/写文档-关闭文档
参看Python中的文件IO操作(读写文件、追加文件)
我之前用write好像遇到了什么问题…但是不太记得了…所以换成了print…
# 2019.12.17
# ASerendipity_
import time
import requests
from bs4 import BeautifulSoup
# 定义获取页面的函数
def get_page(url, params=None, headers=None):
response = requests.get(url, headers=headers, params=params)
page = BeautifulSoup(response.text, 'lxml')
print(response.url)
print("响应状态码:", response.status_code)
return page
bookTitle_list = [] # 书本名列表
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Host': 'book.douban.com'
}
for i in range(11):
params = {"start": (i * 25)}
page = get_page('https://book.douban.com/top250', params=params, headers=headers)
# page = get_page('https://book.douban.com/top250?start=0')
div_list = page.find_all('div', class_='pl2')
for div in div_list:
bookTitle = "".join(div.a.text.split())
bookTitle_list.append(bookTitle)
# 每次爬完后休眠1秒钟,防止爬取速度太快被封ip
time.sleep(1)
#print(bookTitle_list)
doc = open('Top250Books.txt', 'w', encoding="utf-8")
for i in range(len(bookTitle_list)):
print(bookTitle_list[i], file=doc)
doc.close()
output:
同样的导出文档
跟上面的代码真的就很相似了,就不赘述了,遇到几个问题,写一下吧。
前一个代码用的是strip()去字符串首尾的空格,这一次就出现了问题。有些书的名字显示的格式不一样,比如↓
就换了一种提取方式
“”.join(a.split())
这样中间的空格也能去掉啦~
这篇Python中常见字符串去除空格的方法总结讲的几种方法,可参考。
这个简直…无解…
我正常的去搜了一下 然后发现了…↓↓↓
我: ???
现在明白了…触发了反爬…刚又遇到了