抓取猫眼电影top100的正则、bs4、pyquery、xpath实现方法

import requests
import re
import json
import time
from bs4 import BeautifulSoup
from pyquery import PyQuery as pq
from lxml import etree

# 获取页面源码
def get_one_page(url):
    try:
        headers = {  # 伪装请求头
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36'
        }
        response = requests.get(url, headers=headers)  # 构造响应

        if response.status_code == 200:  # 判断状态码
            return response.text
        return None
    except requests.exceptions.RequestException as r:
        return None

# 正则表达式提取源码关键信息
def parse_one_page(html):
    # 正则表达式查询目标信息
    pattern = re.compile(
        '<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
    items = re.findall(pattern, html)
    for item in items:
        # 包含yield表达式的函数是特殊的函数,叫做生成器函数(generator function),被调用时将返回一个迭代器(iterator),调用时可以使用next或send(msg)。它的用法与return相似,区别在于它会记住上次迭代的状态,继续执行。
        yield{  # yield关键字
            'index': item[0],
            'image': item[1],
            'title': item[2].strip(),
            'actor': item[3].strip()[3:],  # if len(item[3])>3 else '',
            'time': item[4].strip()[5:],  # if len(item[4])>5 else '',
            'score': item[5].strip()+item[6].strip()
        }

#Xpath提取信息
def xpath_demo(html):
    html=etree.HTML(html)
    str1='//dd['
    for i in range(10):
        yield{  # yield关键字
            'index': html.xpath(str1+str(i)+']/i/text()'),
            'image': html.xpath(str1+str(i)+']/a/img[@class="board-img"]/@data-src'),
            'title': html.xpath(str1+str(i)+']//p/a[@data-act="boarditem-click"]/text()'),
            'actor': ''.join(html.xpath(str1+str(i)+']//p[@class="star"]/text()')).strip(),
            'time': html.xpath(str1+str(i)+']//p[@class="releasetime"]/text()'),
            'score': ''.join(html.xpath(str1+str(i)+']//p[@class="score"]/i/text()')),
        }

# bs4提取关键信息
def bs4_demo(html):
    soup = BeautifulSoup(html, 'lxml')
    # pq=PyQuery(html)
    # for item in pq('dd img/.board-img')
    for dd in soup.find_all(name='dd'):
        yield{
            'index': dd.find(name='i', attrs={'class': 'board-index'}).string.strip(),#去掉前后空格
            'image': dd.find(name='img', attrs={'class': 'board-img'})['data-src'],
            'title': dd.find(name='p', attrs={'class': 'name'}).string.strip(),
            'actor': dd.find(name='p', attrs={'class': 'star'}).string.strip(),
            'time': dd.find(name='p', attrs={'class': 'releasetime'}).string.strip(),
            'score': dd.find(name='i', attrs={'class': 'integer'}).string+dd.find(name='i', attrs={'class': 'fraction'}).string
        }

#pyquery css筛选信息
def pyquery_demo(html):
    doc=pq(html)
    for dd in doc('dd').items():
        yield{
            'index': dd.find('i.board-index').text(),#获取文本
            'image': dd.find('img.board-img').attr('data-src'),#获取属性
            'title': dd.find('p.name a').text(),
            'actor': dd.find('p.star').text(),
            'time': dd.find('p.releasetime').text(),
            'score': dd.find('p.score i.integer').text()+dd.find('p.score i.fraction').text()
        }

def write_to_file(content):
    with open('/Users/zz/Desktop/result.txt', 'a', encoding='utf-8') as f:
        # json.dumps()实现字典的序列化,ensure_ascii=False保证输出非Unicode编码
        f.write(json.dumps(content, ensure_ascii=False)+'/n')

def main(offset):
    url = 'https://maoyan.com/board/4?offset='+str(offset)
    html = get_one_page(url)
    # for item in parse_one_page(html):
    #for item in bs4_demo(html):
    #for item in pyquery_demo(html):
    for item in xpath_demo(html):
        print(item)
        # write_to_file(item)  # 写入文件

if __name__ == '__main__':  # 是否从控制台执行
    for i in range(10):
        main(offset=i*10)
        time.sleep(1)#避免操作过快被识别

原文地址:https://www.cnblogs.com/zhangzhe532/p/10661523.html

时间: 2024-08-27 22:11:18

抓取猫眼电影top100的正则、bs4、pyquery、xpath实现方法的相关文章

python学习之抓取猫眼电影Top100榜单

目录 1 本篇目标 2 url分析 3 页面抓取 4 页面分析 5 代码整合 6 优化 参考: 近期开始学习python爬虫,熟悉了基本库.解析库之后,决定做个小Demo来实践下,检验学习成果. 1 本篇目标 抓取猫眼电影总排行榜Top100电影单 根据电影演员表统计演员上榜次数 2 url分析 目标站点为https://maoyan.com/board/4,打开之后就可以看到排行榜信息,如图所示 页面上显示10部电影,有名次.影片名称.演员信息等信息.当拉到最下面点击第二页的时候,发现url变

爬虫实战01——爬取猫眼电影top100榜单

#需求:抓取猫眼电影TOP100的电影名称.时间.评分.图片等信息,提取的结果会以文件的形式保存下来 import requests import time from lxml import etree import json import csv import codecs class MaoYanTop100Spider: #存储电影详情页的url film_page_url_list = [] #存储每个的电影信息 #film_info = {} film_info_list = [] #

00_抓取猫眼电影排行TOP100

前言: 学习python3爬虫大概有一周的时间,熟悉了爬虫的一些基本原理和基本库的使用,本次就准备利用requests库和正则表达式来抓取猫眼电影排行TOP100的相关内容. 1.本次目标: 需要爬去出猫眼电影排行TOP100的电影相关信息,包括:名称.图片.演员.时间.评分,排名.提取站点的URL为http://maoyan.com/board/4,提取的结果以文本形式保存下来. 2.准备工作 只需要安装好requests库即可. 安装方式有很多种,这里只简单的介绍一下通过pip这个包管理工具

用pyquery 初步改写崔庆才的 抓取猫眼电影排行(正在更新)特意置顶,提醒自己更新

目前正在学Python爬虫,正在读崔庆才的<Python3网络爬虫开发实战>,之前学习正则表达式,但是由于太难,最后放弃了(学渣的眼泪....),在这本书上的抓取猫眼电影排行上,后来自学了pyquery,发现用pyquery可以解决这个问题,目前自己试着写了代码 这个是抓取一页的情况的代码(没有图的链接以及排名还有其他90页的情况) import requests from pyquery import PyQuery as pq def get_one_page(url): headers

python爬取猫眼电影top100排行榜

爬取猫眼电影TOP100(http://maoyan.com/board/4?offset=90)1). 爬取内容: 电影名称,主演, 上映时间,图片url地址保存到mariadb数据库中;2). 所有的图片保存到本地/mnt/maoyan/电影名.png 代码: import re import pymysql as mysql from urllib import request from urllib.request import urlopen u = 'root' p = 'root'

Python-爬虫-基本库(requests)使用-抓取猫眼电影Too100榜

1 #抓取猫眼电影,https://maoyan.com/board/4 榜单电影列表 2 import requests 3 import re 4 from requests.auth import HTTPBasicAuth 5 6 #定义爬虫工具类 7 class SpiderTools(): 8 def __init__(self): 9 super(SpiderTools, self).__init__() 10 #抓取首页信息 11 def load_onePage(self,ur

# [爬虫Demo] pyquery+csv爬取猫眼电影top100

目录 [爬虫Demo] pyquery+csv爬取猫眼电影top100 站点分析 代码君 [爬虫Demo] pyquery+csv爬取猫眼电影top100 站点分析 https://maoyan.com/board/4?offset=0 翻页操作只会改变offset偏移量,每部电影的信息都在dd标签内,使用pyquery库中的css选择器直接解析页面 代码君 css选择器直接选择和使用find()方法的区别:find()用于选择子节点,因此限定了选择的区域,速度可能要快些,直接传入''选择器可能

python爬虫,爬取猫眼电影top100

import requests from bs4 import BeautifulSoup url_list = [] all_name = [] all_num = [] all_actor = [] all_score = [] class Product_url(): # 这个地方传入的url是 https://maoyan.com/board/4?offset= global url_list def __init__(self, url): self.url = url for x i

python爬取猫眼电影top100

最近想研究下python爬虫,于是就找了些练习项目试试手,熟悉一下,猫眼电影可能就是那种最简单的了. 1 看下猫眼电影的top100页面 分了10页,url为:https://maoyan.com/board/4?offset=0 我们发起请求,得到相应: 我们 我使用的是requests库,这是一个第三方的库. 2 利用正则解析爬取下的页面 当然你也可以使用xpath和bs4. 我们先看一下网页的源代码: 然后根据代码写出要匹配的正则,然后对匹配出来的数据做解析: 3 将抓到的数据写入本地文件