需要安装相应的库,下面的库都是可能会用到的:
requests库:
pip install requests
selenium库:
pip install selenium
BeautifulSoup4库:
pip install BeautifulSoup4
lxml解析器;
pip install lxml
使用BeautifulSoup解析HTML
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。
#导入requests包 import requests #导入BeautifulSoup包 from bs4 import BeautifulSoup #导入lxml import lxml
为了避免浏览器识别出爬虫,需要设置User-Agent
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}
使用requests.get()获取网页
response = requests.get(url,headers=headers)
构建BeautifulSoup对象
soup = BeautifulSoup(response.text, "lxml")
拿到soup对象后就可以开始解析网页了,BeautifulSoup更多用法请参考官网
常用方法:
- soup.find_all(‘xxx’):获取所有xxx标签元素,返回一个list。
- soup.p.attrs:获取p标签的所有属性,返回一个dict
- h3.text:获取h3标签包含的文本内容
- find_previous(‘div’)和find_next(‘div’):获取前/后一个div节点
- p.children:获取p节点的所有子节点
- p.parent:获取p节点的父节点(.parents则是得到所有父节点)
- .next_sibling 和 .previous_sibling:获取兄弟节点,同一层为兄弟
- find_parents() 和 find_parent():搜索当前节点的父辈节点
find_all方法详解:
- find_all(‘div’):获取所有div,返回一个list
- find_all(id=‘link2’):获取所有id是link2的节点,返回一个list,可以指定多个参数,逗号隔开(例:find_all(href=re.compile(“elsie”), id=‘link1’)),支持正则表达式
- find_all(attrs={“data-foo”: “value”}):可以配合attrs使用
- find_all(“a”, class_=“sister”):如果直接给出class的话需要写出class_,因为class是python的关键字,class_接受正则表达式。第二个参数或者写出attrs={“class”: “sister”}
- find_all(“a”, limit=2):limit参数限制返回结果条数
- find():与find_all()方法相同,唯一区别就是find()只返回一个结果
使用selenium爬取数据:
有时候要爬取的数据是网页通过JS动态加载出来的,这时要爬取数据可以使用selenium库
selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
#导包 from selenium import webdriver from selenium.webdriver.chrome.service import Service
在使用selenium前需要安装相应的浏览器驱动,驱动和浏览器版本一定要一致,详见官网。
#获取驱动对象
s = Service("software/msedgedriver.exe")
driver = webdriver.Edge(service=s)
设置隐式等待时间:
隐式等待:设置一个最长时间,如果在规定时间内网页加载完成则执行下一步,否则一直到等待时间结束
# 隐式等待
driver.implicitly_wait(5)
#打开网页
driver.get('https://image.baidu.com/')
selenium常用方法:(下面d代表driver)
- d.back()和d.forward():浏览器后退和前进
- d.refresh():刷新
- d.current_window_handle:获得当前窗口句柄
- d.window_handles:获取所有打开的窗口句柄,-1表示当前窗口
- d.current_url:获取当前窗口url
- d.switch_to.window():切换窗口
- find_element()和find_elements():查找元素
- d.close():关闭窗口
- d.quit():退出浏览器
- d.execute_script():当前窗口上下文中执行JS代码
- click():点击
- send_keys():发送键位,一般用于输入框输入信息
- d.switch_to.active_element():获取当前焦点元素,对于一些鼠标放上去存在,而移开时消失的节点进行操作时可以使用此方法
- locate_with().above({}):相对定位,above表示元素上,below表示元素下,to_left_of表示元素左,to_right_of表示元素右,near表示附近
- d.key_down()和d.key_up():模拟按下/释放辅助按键(control、shift、alt)
find_element()说明:
4版本使用By.xxx来定位数据,例:find_element(By.XPATH, ‘//*[@id=“kw”]’)等价于find_element_by_xpath(xxxx)
#导包 from selenium.webdriver.common.by import By
By的方法无需刻意记,编译器一般有提示,记住如何使用即可
存储数据
使用json库将数据格式化后存储到文件
#导包 import json
方法说明:
json.dump():用于将python对象编码成JSON串,必须是字典类型
json.load():用于解码JSON数据,返回dict
写入到文件:
#datetime.now().strftime("%Y%m%d")是将当前日期格式化
with open('/home/' + str(datetime.now().strftime("%Y%m%d")) + '.json', 'w',encoding='UTF-8') as f:
json.dump(数据对象,f,ensure_ascii=False)
从文件读出数据:
#读出来的数据datas是dict类型的
with open('/home/' + str(datetime.now().strftime("%Y%m%d")) + '.json','r',encoding='UTF-8') as f:
datas = json.load(f)
存储图片
#请求图片url
r = requests.get(url,headers=headers)
# wb表示以二进制打开文件并写入,文件名不存在会创建
with open('/home/picture/1.png', 'wb') as f:
f.write(r.content) # 写入二进制内容



