爬虫:核心是对网站的url接口进行操作
原理:用户在与网站交互的信息,都是以链接的形式向后台提交,因此,只要分析网站提交的连接形式,就可以用程序模拟用户查询的操作,便可以得到数据,下一步进行解析,最后输出保存。
一、原生版
Q1:网络请求的实现
- Request库
import requests
url = "https://item.jd.com/100001860765.html"
try:
r = requests.get(url) # 定义response对象r,它包含request请求,可以查看它的头部
r.raise_for_status() # status_code 是 200 时,成功请求。如果是失败请求,会通过这个函数抛出异常(翻译:根据状态唤起)
r.encoding = r.apparent_encoding # 指定request的编码,改成可以阅读的
print(r.text[:200]) #打印内容
print(r.request.headers)
except:
print("爬取失败") # 异常处理
Q2:伪装用户的浏览器,发起http请求
网站接收由浏览器发起的http请求,有的网站会进行来源审查,拒绝网络爬虫。这里User-Agent告诉了对方网站自己是python程序产生的。
step 1:
response对象包含了发出的request对象,可以查看发出去的请求头
print(r.request.headers) # 发出的http请求的头部信息,内容如下:
{'User-Agent': 'python-requests/2.21.0'……}
step 2:
request库,可以更改头部信息。
即实现让程序去模拟浏览器,去发送请求。
kv = {'User-Agent': 'Mozilla/5.0'} # 重新定义一个键值对,Mozilla/5.0是浏览器的身份标识
r = requests.get(url, headers = kv) # 定义response对象r,它包含request请求,可以查看它的头部,并对headers的字段修改
Q3:程序实现向搜索引擎提交关键词,实现自动搜索。
step1:搜索引擎关键词提交接口
百度的关键词接口:http://www.baidu.com/s?wd=keyword
step2:问题转换为–>构造一个这样的url
kv = {'wd': 'python是什么'}
url = "http://www.baidu.com/s"
r = requests.get(url, params=kv)
打印信息:
print(r.status_code)
print(r.request.url)
返回结果:
200
http://www.baidu.com/s?wd=python%E6%98%AF%E4%BB%80%E4%B9%88
Q4:爬取图片
step 1: 分析网页图片的地址格式,以.jpg等结尾
http://img0.dili360.com/pic/2019/03/06/5c7f6fb5a077c9494825493.jpg
step 2:图片是二进制格式,保存为文件时用二进制方式。
截取图片名称,创建文件目录,定义存储图片路径。
step 3:
文件操作
import requests
import os # os库
url = "http://img0.dili360.com/pic/2019/03/06/5c7f6fb5a077c9494825493.jpg"
root = "D://picSpider//"
path = root + url.split('/')[-1] # 字符串的splite()函数,按照'/'截取,返回列表对象。
try:
if not os.path.exists(root): # 如果目录不存在,创建目录
os.mkdir(root)
if not os.path.exists(path): # 如果图片不存在,爬取图片
r = requests.get(url)
with open(path, 'wb') as f: # 以二进制格式打开一个文件,用于写入。如果path的文件不存在,自动创建文件。打开的文件,命名为f
f.write(r.content) # r.content是返回数据的二进制形式。将二进制数据写入文件
f.close() # 关闭文件
print("图片保存成功!")
else:
print("图片已经存在!")
except:
print("爬取失败!")
Q5:解析得到的HTML文件
- Beautiful Soup库:[HTML的解析器]
python3.7安装BeautifulSoup4,引入时用bs4,从库里边只导入BeautifulSoup类,就可以用BeautifulSoup解析HTML 5格式、CSS格式的源代码
step1:BeautifulSoup的使用
from bs4 import BeautifulSoup
soup = BeautifulSoup(‘这里放HTML’, 'html.parser')
比如:
soup1 = BeautifulSoup("<html>data</html>", 'html.parser')
soup2 = BeautifulSoup(open("D://demo.html"), 'html.parser')
step 2:与网络请求结合
from bs4 import BeautifulSoup
import requests
url = 'https://item.jd.com/100003302532.html' # 页面url
r = requests.get(url)
demo = r.text[:1000]
soup = BeautifulSoup(demo, 'html.parser') #一行代码搞定
print(soup)
step 3: 遍历解析好的HTML标记信息
HTML文件是树形结构,文档对应标签树(BeautifulSoup类),就是这里的soup。
遍历方式:从上至下,从下至上,层次遍历
基本元素 | 使用说明 |
---|---|
Tag | soup.标签名 |
Name | soup.标签名.name |
NavigableString | soup.标签名.string |
下行遍历 | 上行遍历 | 层次遍历 |
---|---|---|
.contents | .parent | .next_sibling |
.children | .parents | .previous_sibling |
.contents | .next_siblings | |
.descendants | .previous_siblings |
print(soup.prettify())
for link in soup.find_all('link'):
print(link.get('href'))
小结:
-
python语法
python对大小写敏感
python异常处理的框架:try–except
python 3编码格式:utf-8
文件路径,用双斜杠’D://picSpider’
函数
string的
splite() -
file库【file库,可以处理文件等操作】
open(path,‘wb’) as f:
f.write()
f.close() -
requests库 【requests库,可以处理网络请求等操作】
requests.get()
get()中的参数:params= , headers=,
response对象:
r.status_code
r.text
r.raise_for_status()管理触发异常
r.encoding=r.apparent_encoding
r.request.url
r.request.headers
r.content 是返回内容的二进制形式 -
os库 【os库,可以处理文件目录等操作。】
os.path.exists(path)
os.mkdir(root) -
BeautfulSoup库 【bs4库,可以处理HTML格式解析等操作。】
soup.prettify() #输出友好的标记信息
#bs4的内容编码:utf-8,和Python3没有编码障碍
Selenium
Selenium是浏览器测试工具。可以实现爬虫。
Q1:安装
step1:cmd命令行下,输入pip install selenium
step2:下载火狐浏览器驱动geckodriver.exe,放到Firefox安装目录下
step3:在环境变量Path中添加Firefox安装目录的路径:C:\Program Files\Mozilla Firefox;
step4:重启pycharm,然后运行程序即可