仍然以糗事百科 http://www.qiushibaike.com/text/
的段子数据抓取来说明。
结构化数据,就是对应一个数据块,编程中的一个对象,数据库中的一条记录。
结构化数据抓取的原则,循环点要放在包含整块数据标签处。即『先取大再取小』。
抓取数据字段:
- 段子作者
- 段子内容
- 好笑数
- 评论数
选取的循环点放在这个div
上,使用class
属性,不要使用id
<div class="article block untagged mb15" id='qiushi_tag_118966710'>
直接上代码。大家重点掌握 XPath�的方法。bs4的selector,还是 XPath,都是用Chrome工具来 copy ,再根据网页结构作一些调整。
一、使用BeautifulSoup
# coding=utf-8
import requests
from bs4 import BeautifulSoup
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
headers={"User-Agent":user_agent} #请求头,headers是一个字典类型
html = requests.get('http://www.qiushibaike.com/text/',headers=headers).content
soup = BeautifulSoup(html,'lxml')
#注意以下注释的是不同的方法或定位,都可以
#divs = soup.find_all('div',class_="article block untagged mb15")
#divs = soup.select('div .article.block.untagged.mb15') # 注意这里 class属性中有空格,都转为.
divs = soup.select('div.col1 > div') # 这里是用从一层标签开始定位的。
for div in divs:
author = div.select('div > a > img')
if author :
print author[0]['alt']
content = div.select('a > div > span')[0].text
print content
funny = div.select('div.stats > span.stats-vote > i')[0].text
print funny
comment = div.select('div.stats > span.stats-comments > a > i')[0].text
print comment
二、使用XPath
# coding=utf-8
import requests
from lxml import etree
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
headers={"User-Agent":user_agent} #请求头,headers是一个字典类型
html = requests.get('http://www.qiushibaike.com/text/',headers=headers).content
selector = etree.HTML(html)
divs = selector.xpath('//div[@class="article block untagged mb15"]')
for div in divs:
author = div.xpath('div[1]/a[2]/@title')
print author[0]
content = div.xpath('a[1]/div/span/text()[1]')
print content[0]
funny = div.xpath('div[2]/span[1]/i/text()')
print funny[0]
comment = div.xpath('div[2]/span[2]/a/i/text()')
print comment[0]
以上数据只作了打印显示。