爬虫实战-猫眼电影爬虫

1.bs4

from fake_useragent import UserAgent
from bs4 import BeautifulSoup
import requests
def test_bs():
    #设置url
    url='https://www.maoyan.com/films?showType=3'
    #设置请求头
    headers={'User-Agent': UserAgent().chrome}
    #发送请求
    response=requests.get(url, headers=headers)
    print('-----aaa-----')
    # print(response.text)
    #解析响应
    soup=BeautifulSoup(response.text,'lxml') 
    #提取名称
    names=[name.text for name in soup.select('span[class="name"]')]
    #提取评分
    grades=[grade.text for grade in soup.select('div[class~="channel-detail"][class~="channel-detail-orange"]')]
    #打印结果
    print('----bbb---')
    for i,j in zip(names,grades):
        print(f'name={i}, grade={j}')
        
if __name__ == '__main__':
    test_bs()

2.pyquery

from fake_useragent import UserAgent
from pyquery import PyQuery as pq
import requests
def test_bs():
    #设置url
    url='https://www.maoyan.com/films?showType=3'
    #设置请求头
    headers={'User-Agent': UserAgent().chrome}
    #发送请求
    response=requests.get(url, headers=headers)
    #解析响应
    #构建一个pyquery对象
    doc=pq(response.text)
    print(response.text)
    #提取名称
    name_divs=doc('div.channel-detail.movie-item-title')
    names=[name_divs.eq(i).text() for i in range(len(name_divs))]
    #提取评分
    grade_divs=doc('div.channel-detail.channel-detail-orange')
    grades=[grade_divs.eq(j).text() for j in range(len(grade_divs))]
    #打印结果
    for m,n in zip(names,grades):
        print(f'name={m}, grade={n}')
        
if __name__ == '__main__':
    test_bs()

3.xpath

from fake_useragent import UserAgent
from pyquery import PyQuery as pq
import requests
from lxml import etree
def test_xpath():
    #设置url
    url='https://www.maoyan.com/films?showType=3'
    #设置请求头
    headers={'User-Agent': UserAgent().chrome}
    #发送请求
    response=requests.get(url, headers=headers)
    # print(response.text)
    #解析响应
    #构建一个etree对象
    e=etree.HTML(response.text)
    #提取名称
    names=e.xpath('//div[@class="channel-detail movie-item-title"]/@title')
    # print(names)
    #提取评分
    grades=[div.xpath('string(.)') for div in e.xpath('//div[@class="channel-detail channel-detail-orange"]')]
    #打印结果
    for m,n in zip(names,grades):
        print(f'name={m}, grade={n}')
        
if __name__ == '__main__':
    test_xpath()

4.re,findall

from fake_useragent import UserAgent
import requests
import re
def test_bs():
    #设置url
    url='https://www.maoyan.com/films?showType=3'
    #设置请求头
    headers={'User-Agent': UserAgent().chrome}
    #发送请求
    response=requests.get(url, headers=headers)
    #解析响应
    #提取名称
    names=re.findall('<div class="channel-detail movie-item-title" title="(.+?)">',response.text)
    #提取评分
    grades=[get_score(data) for data in re.findall('<div class="channel-detail channel-detail-orange">(.+?)</div>',response.text)]
    #打印结果
    for m,n in zip(names,grades):
        print(f'name={m}, grade={n}')
def get_score(data):
     if data!='暂无评分':
        data='.'.join(re.findall('\d+',data))       
     return data
if __name__ == '__main__':
    test_bs()

5.注意事项

5.1对于判断class属性的条件选择器,如果要判断class属性值等于某个值,可以使用 . 作为前缀,后面跟上具体的属性值。如果一个元素的class属性值包含多个值,可以使用空格来分隔这些值。
例如,如果要选择class属性值等于name的span元素,可以使用以下选择器:
soup.select('span[class="name"]')
如果要选择class属性值包含name和other的span元素,可以使用以下选择器:
soup.select('span[class~="name"][class~="other"]')
其中,~= 表示包含选择,多个属性值之间使用空格分隔。
同样的,如果要选择class属性值包含channel-detail和channel-detail-orange的div元素,可以使用以下选择器:
soup.select('div[class~="channel-detail"][class~="channel-detail-orange"]')

5.2

5.3 有的时候明明语法没错误,但是就是没结果,有可能是网络反爬虫结果导致,建议等一段时间,或者重新刷新网页

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值