1、前言
- 网页上我们能看到的东西,都是可以爬取的。富文本除外。
- 爬取数据的过程一般来说分为2个阶段:
第一个阶段:发起请求
第二个阶段:使用正则表达式或第三方库解析数据(BeautifulSoup)。
2、发起请求
2.1 请求头的伪装(比较常见的反爬虫策略,会验证请求头里的哪些东西)
from fake_useragent import UserAgent # 爬虫请求头伪装
import json
from urllib3.exceptions import InsecureRequestWarning
from urllib3 import disable_warnings
disable_warnings(InsecureRequestWarning) # 禁止https(ssl)问题的报错
ua = UserAgent() # 爬虫请求头伪装
proxies = {
"http": "http://"+proxies_ip, # http 型的
"https": "http://"+proxies_ip # https 型的
}
# 定制请求头
my_headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'User-Agent': ua.chrome,
}
response = requests.get(uri, headers=my_headers,proxies=proxies)
一般来说按照以上的方式来配置请求头大部分的网站你都可以正常爬取了
2.2 有一些网站在爬取过程中需要登录,那么你需要自定义请求头里的cookie
参考:https://docs.python-requests.org/zh_CN/latest/user/quickstart.html#cookie
2.3 如果目标网站在爬取的过程中:还伴随着验证码
图形验证码可以使用一些第三方API对图片进行解析。不过,遇到这个验证码,我建议还是降低爬虫的频率吧!
2.4 常见的异常
- 当你看到你的程序抛出了抛出
ConnectionError
错误,那一般就是因为目标网站监测出你是爬虫了。
2、内容解析find_all()使用说明(参考Beautiful Soup 4.9.0 文档)
find_all()
方法签名:find_all(name,attrs,recursive,string,limit,** kwargs)
该find_all()方法浏览标记的后代,并检索与过滤器匹配的所有后代。我在“种类的过滤器”中给出了几个示例,但这里还有更多示例:
soup.find_all("title")
# [<title>The Dormouse's story</title>]
soup.find_all("p", "title")
# [<p class="title"><b>The Dormouse's story</b></p>]
soup.find_all("a")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
soup.find_all(id="link2")
# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
import re
soup.find(string=re.compile("sisters"))