【爬虫】-001-使用BeautifulSoup解析网页
2017-12-26 本文已影响188人
9756a8680596
1.使用BeautifulSoup+requests解析网页
1)BeautifulSoup
- Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。主要作用是将HTML的标签文件解析成树形结构,然后方便地获取到指定标签的对应属性。
-
BeautifulSoup()
的构造方法需要传入两个参数,如下图所示:
a. 一段网页代码或一个网页文件;
b. 另一个是解析网页的库,这里使用lxml
库.
BeautifulSoup
2)requests
-
服务器和本地的交换机制,如下图
request and response procedure - 向服务区发起
request
请求常用方式:post
和get
,其中get
方法可以提交要访问的URL,浏览器和用户信息等内容 - 服务器将请求的内容以
response
返回,包括:状态(status_code: 200/404)
和网页元素等 -
线上网页中的问题和思路
a. 页面乱码
b. select返回为空列表
c. soup.select()选择标签问题
d. soup.select()尽量不使用完整selector
e. 反抓取:模拟浏览器headers
里面的User-Agent
和Cookie
随get
一起请求
f.stripped_strings
获得父标签下子标签的所有文本信息
g. 通过获取元素的CSS
样式中的参数信息,如href
中的URL或者判断DIV
2. 描述要爬取的东西在页面中的路径
-
页面元素的位置可以通过页面的
CSS Selector and XPathtag
或者CSS
-
lxml
库通过元素的CSS
样式获取元素的位置,即浏览器调试中审查元素的CSS Selector
-
元素的CSS Selector不一定需要写最长的,只要能够保证唯一定位元素即可,甚至可以采用标签的属性来定位如
'img[weight="100"]'
3. 从标签中获取需要的信息,并以一定的数据结构存储
4. 例子:抓取链家-杭州二手房部分信息
# 导入相关库
from bs4 import BeautifulSoup
import time
import requests
url_lianjia = 'https://hz.lianjia.com/ershoufang/'
headers = {#模拟浏览器请求,可以用 cookie模拟登陆状态
'User-Agent':'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
}
time.sleep(4) #延时请求
wb_data = requests.get(url_lianjia, headers=headers) #使用requests向服务器发起get请求,通过header模拟浏览器行为
soup = BeautifulSoup(wb_data.text, 'lxml') #将服务器返回的对象使用BeautifulSoup解析,wb_data为response对象,需要文本化
# 确定要抓取的元素位置
titles = soup.select('body > div.content > div.leftContent > ul > li > div.info.clear > div.title > a') #返回值类型为list
imgs = soup.select('body > div.content > div.leftContent > ul > li > a > img')
total_prices = soup.select('body > div.content > div.leftContent > ul > li > div.info.clear > div.priceInfo > div.totalPrice > span')
unit_prices = soup.select('body > div.content > div.leftContent > ul > li > div.info.clear > div.priceInfo > div.unitPrice > span')
tags = soup.select('body > div.content > div.leftContent > ul > li > div.info.clear > div.tag')
# 数据格式化,最终放到字典中
for title, img, total_price, unit_price, tag in zip(titles, imgs, total_prices, unit_prices, tags):
data = {
'title': title.get_text(),
'img': img.get('src'),
'total_price': total_price.get_text(),
'unit_price': unit_price.get_text(),
'tag': list(tag.stripped_strings)
}
print(data)
5. 异步加载数据的抓取
- 什么是异步加载:由JS控制,不断加载的数据
- 动态数据查看方法
-- 使用浏览器的调试窗口,查看network->XHR
,查看相关信息:Headers
(向服务器发起的请求)和Response
(服务器返回信息)等
-- 知道动态加载的内容在页面代码中的位置和页面的动态链接生成规则
-- 其余参考以上
references:
1.Beautiful Soup 4.2.0 文档. https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html