- pyquery解析库使用
- Mongo使用
- 豆瓣电影/音乐爬取
Pyquery使用
直接上源码,如下是豆瓣电影top250源码部分,
<li>
<div class="item">
<div class="pic">
<em class="">2</em>
<a href="https://movie.douban.com/subject/1291546/">
<img width="100" alt="霸王别姬" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p1488213971.webp" class="">
</a>
</div>
<div class="info">
<div class="hd">
<a href="https://movie.douban.com/subject/1291546/" class="">
<span class="title">霸王别姬</span>
<span class="other"> / 再见,我的妾 / Farewell My Concubine</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 陈凯歌 Kaige Chen 主演: 张国荣 Leslie Cheung / 张丰毅 Fengyi Zha...<br>
1993 / 中国大陆 香港 / 剧情 爱情 同性
</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.6</span>
<span property="v:best" content="10.0"></span>
<span>1115749人评价</span>
</div>
<p class="quote">
<span class="inq">风华绝代。</span>
</p>
</div>
</div>
</div>
</li>
想要获取的信息:
电影名:title
导演:director
评分:rating_num
评价人数:nums
介绍:quota
pyquery解析遵循:***找到节点-解析节点***的思路,
定位节点的方法有:父节点/子节点/兄弟节点
解析节点包含:获取文字/属性
——————————————————————————————
首先定位每一个项目的位置,根据item来确定
电影名根据节点和属性定位:'title':item('span[class="title"]').text()
对导演做正则解析,注意源码中的&并不能匹配到
auth_pattern = re.compile(r': (.*?) ') #注意源代码中的&并不能匹配到
authinfo = item('.bd').find('p[class=""]').text()
'author':auth_pattern.search(authinfo).group(1)
最后存入数据库中!
最终代码如下:
import re
import requests
import pymongo
from pyquery import PyQuery as pq
MAX_PAGE = 10
def parse_page(index):
url = 'https://movie.douban.com/top250?start={}'.format((index-1)*25)
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'}
res = requests.get(url,headers=headers).text
doc = pq(res)
items = doc.find('.item').items()
num_pattern = re.compile(r'\d+')
auth_pattern = re.compile(r': (.*?) ') #注意源代码中的&并不能匹配到
for item in items:
numinfo = item('.star span').eq(3).text()
#print(numinfo)
authinfo = item('.bd').find('p[class=""]').text()
#authinfo = item('.bd p').text()
movie = {
'title':item('span[class="title"]').text(),
'author':auth_pattern.search(authinfo).group(1),
'score':item('.rating_num').text(),
'num':num_pattern.search(numinfo).group(0),
'quota':item('.quote').text()
}
print(movie)
save_to_Mongodb(movie)
def save_to_Mongodb(data):
#连接Mongodb
client = pymongo.MongoClient(host='localhost',port=27017)
#指定数据库
db = client.douban
#指定集合
collection = db.doubanmovie
collection.insert_one(data)
def main():
for i in range(1,MAX_PAGE+1):
parse_page(i)
if __name__ == "__main__":
main()