1.准备环境
- python环境:3.10
2.常用库
1.请求库:实现 HTTP 请求操作
- requests:基于 urllib 编写的,阻塞式 HTTP 请求库,发出一个请求,一直等待服务器响应后,程序才能进行下一步处理。
- selenium:自动化测试工具。一个调用浏览器的 driver,通过这个库你可以直接调用浏览器完成某些操作,比如输入验证码。
2.解析库:从网页中提取信息
- Beautifulsoup:html 和 XML 的解析,从网页中提取信息,同时拥有强大的API和多样解析方式。
- lxml:支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。
- json:可以将数据格式转化为json格式更便于解析读取。
- re:利用正则表达式提取数据。
3.其他常用库
- fake_useragent库
引入:from fake_useragent import UserAgent
用法:实现请求头伪装
# 请求头伪装
ua = UserAgent()
header = {
'User-Agent':ua.chrome}
3.安装方式
添加库的方法:
1.Windows+R打开运行,然后输入CMD进入命令提示符。
2.输入:where python 。就会反馈出python安装地址。
3.cd C:\Program Files\Python39\Scripts(cd+安装目录下的Scripts文件夹,可以先找到文件夹,以防找错地址)
4.输入各种更新语句
更新pip:python -m pip install --upgrade pip
更新某库(如requests库):pip install requests
更新某库指定版本:pip install bert4keras==0.5.9
pip换源
通过pip install添加库时会因为从国外地址下载,连接速度特别慢。国内一些有担当的高校和公司会通过建立镜像源,来帮助国内用户从其服务器下载,更方便去学习python。
换源语句
换源如:换阿里源语句
pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/
pip config set global.trusted-host mirrors.aliyun.com
一些其他源
国内源:
清华:Simple Index
阿里云:Simple Index
中国科技大学 Verifying - USTC Mirrors
华中理工大学:http://pypi.hustunique.com/
山东理工大学:Loading...
豆瓣:http://pypi.douban.com/simple/
库的查询方法
pip list
我们可以通过命令查看python安装了哪些库,cmd直接输入pip list,可以看到所有库和版本。
4.发送请求
1.请求准备
- url请求链接,首先是写入准备要请求的url
- header请求头,有些网站会对user-agent进行校验来区分爬虫和浏览器请求,这里我们可以利用fake_useragent库里的ua.chrome方法来伪装我们的user-agent
url = 'http://www.baidu.com'
header = {'User-Agent': ua.chrome
}
2.请求方式
这里我们主要介绍两种最主要的请求方式
1.get请求
url = 'https://www.baidu.com'
header = {'User-Agent':ua.chrome
}
response = requests.get(url=url,headers=header,params=None)
这里requests.get()后面包含了多个参数,params是携带的参数,这里可能涉及到分页或者其他属性等等。
查看响应状态码和响应文本
print(response.status_code)
print(response.text)
- 常见的响应状态码:
200 ok:请求成功
301 Move Permanently:永久重定向,以前的url已经过期
302 found:临时重定向
403 Forbidden:服务器拒绝访问
404 not found:资源未找到
500 Internal Server Error:服务器内部错误
这里我们请求百度,响应状态码200,请求成功,获得的文本就是网页的内容。
2.post请求
这里我们以请求广州市政府政策为例:
url = 'http://search.gd.gov.cn/api/search/all'
header = {'User-Agent': ua.chrome
}
d = {'gdbsDivision': "440100",'keywords': "人才",'page': 1,'position': "title",'range': "site",'recommand': 1,'service_area': 200,'site_id': "200001",'sort': "time"
}
response = requests.post(url=url, headers=header, data=d)
这里的data是post请求必须携带的请求参数,服务器会进行校验,根据你请求的数据来返回你想要的数据。
3.selenium模拟浏览器请求
作用:常用于一些数据属于懒加载,请求不到完整数据。或者是存在反爬,cookie,wordtoken校验时无法获取数据时,模拟真实浏览器向服务器发出请求,获取网页源代码再进行解析
a.前置环境
chrome浏览器和对应的chromedriver版本(117对应117版本 不能高也不能低)
Chromedriver下载地址:国内镜像网站CNPM Binaries Mirror
b.发送请求
path = 'chromedriver.exe'
browser = webdriver.Chrome(path)
url = 'https://www.shanghai.gov.cn/'
browser.get(url)
依靠上述代码,就已经对浏览器发出了请求,我们可以通过xpath对页面上的各种输入框,按钮等各种组件进行定位,操控浏览器进行数据请求的操作。常常配合time.sleep()来等待服务器数据加载。
path = 'chromedriver.exe'
browser = webdriver.Chrome(path)
url = 'https://www.shanghai.gov.cn/'
browser.get(url)
time.sleep(1)
# 通过xpath定位输入框
input_area = browser.find_element_by_xpath('//*[@id="search-input"]')
# 定位按钮
button = browser.find_element_by_xpath('//*[@id="searchBtn"]')
# 往输入框内输入内容
input_area.send_keys('人才政策')
# 点击按钮
button.click()
time.sleep(1)
# 切换浏览器页面
browser.switch_to_window(browser.window_handles[1])
print(browser.title)
print('finish')
# 关闭浏览器
browser.quit()
这时我们进入了页面,页面上的数据都可以通过xpath或则bs来进行提取。
5.解析响应数据
1.解析json格式数据
json_data = json.loads(response.text)
直接调用json库的loads方法,将响应数据解析成json格式数据之后,json_data对象的类型变成了一个dict字典类型,更方便索引读取响应数据。
2.etree的xpath解析
etree可以解析文本也可以解析HTML超文本标记
tree = etree.HTML(response.text)
# /html/body/div/div[1]/table/tbody/tr[16]/td[2]/a 2-16
# /html/body/div/div[1]/table/tbody/tr[16]/td[4]
for i in range(2,17):title = tree.xpath('/html/body/div/div[1]/table/tbody/tr['+str(i)+']/td[2]/a/text()')[0]href = tree.xpath('/html/body/div/div[1]/table/tbody/tr['+str(i)+']/td[2]/a/@href')[0]ts = tree.xpath('/html/body/div/div[1]/table/tbody/tr['+str(i)+']/td[4]/text()')[0].strip()
这里我们解析HTML通过xpath路径直接获取对应的web元素,可以进行多次解析,返回的对象是一个list列表。
可以通过/text()来获取文本内容,通过/@href来获取对应的属性值。
6.数据存储
1.写文件
f = open('文件名.txt', mode='w', encoding="utf-8")
f.write('写入文件的内容')
# 关闭文件 自动刷新写入内容
f.close()
2.写入excel表格
# 引入相关库
import xlwt
import xlrd# 创建workbook对象 工作簿
workbook = xlwt.Workbook(encoding='utf-8')
# 工作表
worksheet = workbook.add_sheet("sheet1", cell_overwrite_ok=True) # 默认是不可覆盖 改为可以覆盖内容 这样可以实时更新表单
# 设置单元格宽度
worksheet.col(5).width = 256 * 40
worksheet.col(1).width = 256 * 40
# worksheet.col(4).width = 256 * 12
# 写入标题
# 第0列 0行 写入'内容'
worksheet.write(0,0,'内容')
# 保存并命名工作簿
workbook.save('gz.xls')