Html解析
采用的requests获取网页源码,常用解析网页的库由beautifulSoup和lxml,我采用的是lxml进行解析html,应为chrome浏览器自带获取标签路径,超好用的,见下图
爬去思路:
1.找到种子url,http://movie.douban.com/top250/。
2.找到翻页的 url http://movie.douban.com/top250/%s
3.通过种子页面,找到总共由多少页。
4.根据3中获取的页码,通过2来获取每页的数据
5.整理数据和解析数据。
解析数据
解析数据是一个非常耗时的过程,除非网站有反扒机制,否则最耗时的当然是解析数据。如何解析数据,若是没有 chrome 浏览器提供的 copy/xpath 的话,够你折腾了,需要你结构化HTML文件,然后顺着结构找你需要的信息路径。
给出爬去豆瓣top250电影的源码
from lxml import etree
import requests as rq
source_url = 'http://movie.douban.com/top250/'
url_form = 'http://movie.douban.com/top250/%s'
# 获取网页内容
def get_html(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
}## 请求头
return rq.get(url, headers).content
def parse_page(content):
html = etree.HTML(content)
pages = html.xpath('//*[@id="content"]/div/div[1]/div[@class="paginator"]/a/@href') # 获取页码
return pages
def parse_item(content):
html = etree.HTML(content)
grid_view = html.xpath('//*[@id="content"]/div/div[1]/ol/li')
for i in range(len(grid_view)):
item = []
# title
image_url = '//li[%d]/div[@class="item"]/div[@class="pic"]/a/img/@src' % (i + 1)
image_url_list = grid_view[i].xpath(image_url);
item.append(image_url_list[0])
# print("image_url:", image_url_list)
# item_url
item_url = '//li[%d]/div[@class="item"]/div[@class="info"]/div[@class="hd"]/a/@href' % (i + 1)
item_url_list = grid_view[i].xpath(item_url)
item.append(item_url_list[0])
# print("item_url:", item_url_list)
# image_title
item_title = '//li[%d]/div[@class="item"]/div[@class="info"]/div[@class="hd"]/a/span[@class="title"]' \
'/text()' % (i + 1)
item_title_list = grid_view[i].xpath(item_title)
item.append(item_title_list[0])
# print("item_title:", item_title_list)
# item_other
item_other = '//li[%d]/div[@class="item"]/div[@class="info"]/div[@class="hd"]/a/span[@class="other"]' \
'/text()' % (i + 1)
item_other_list = grid_view[i].xpath(item_other)
item.append(item_other_list[0])
# print("item_other:", item_other_list)
# item_score
item_score = '//li[%d]/div[@class="item"]/div[@class="info"]/div[@class="bd"]/div[@class="star"]' \
'/span/text()' % (i + 1)
item_score_list = grid_view[i].xpath(item_score)
item.append(item_score_list[0])
item.append(item_score_list[1])
# print("item_score:", item_score_list)
print('---------------------------splitter--------------------------------------')
print(item)
# return all_item_list
def main():
parse_item(get_html(source_url))
page_list = parse_page(get_html(source_url))
for i in page_list:
url = url_form % i
parse_item(get_html(url))
if __name__ == '__main__':
main()
上面是整个爬取流程,我相信你对其中的细节很像知道,不然也不会看到这里了。下面是xpath的所用的一些语法:
- 区分路径
<li>
<div class="pic">……</div>
<div class="info">……</div>
</li>
若是一个标签下,有两个完全一抹一眼的同类标签,如何进行区分呢,根据属性,如class。
获取属性为pic下面的所有内容,则需要添加@class==“pic”,并用[]包起来。
路劲/div[@class="pic"]
- 获取属性内容
<a href="https://movie.douban.com/subject/1292052/">
<img
width="100"
alt="肖申克的救赎"
src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp">
</a>
通过Google中copy/xpath获取标签的路径
//*[@id="content"]/div/div[1]/ol/li[1]/div/div[1]/a
如果想获取href的内容,只需要在上面路劲后面加上**@href**
//li[%d]/div[@class="item"]/div[@class="info"]/div[@class="hd"]/a/@href
- 获取标签内容
<span class="title">肖申克的救赎</span>
同理获取路径如下:
//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]
要想获取“肖申克的救赎”,这几个字只需要在这个路基后面加入上text()
//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]/text()