# [爬虫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()用于选择子节点,因此限定了选择的区域,速度可能要快些,直接传入‘’选择器可能要全盘扫描(这里只是为了我自己方便记忆,信息可能有误,欢迎指出)
  • 一般先直接传入选择器选择出包含所需信息的大标签,再使用find()选择大标签里面的细节信息
  • 还有需要注意的一点是,不能直接在Elements选项卡中直接查看源码,那里的源码可能经过JavaScript渲染而与原始请求不同,而是需要从Network选项卡部分查看原始请求得到的源码

使用csv格式存储:相比txt格式,csv格式更利于数据存储和处理,大规模数据可以使用数据库存储

#use pyquery get the data and save as csv
from pyquery import PyQuery as pq #as是为PyQuery类取一个别名
import csv
import time

begin=time.clock() #添加程序开始时间

def get_page(url):
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
    }
    #添加头部信息,防止被网站识别出是python爬虫而被禁止访问
    doc=pq(url,headers=headers)
    return doc

def parse_page(doc):
    dict={}
    dd=doc('.board-wrapper').find('dd')
    '''yield在函数中的功能类似于return,不同的是yield每次返回结果之后函数并没有退出,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用。如果一个函数需要多次循环执行一个动作,并且每次执行的结果都是需要的,这种场景很适合使用yield实现。'''
    for item in dd.items():
        yield { #返回一个字典
            'rank':item.find('.board-index').text(),
            'name':item.find('.name').text(),
            'img':item.find('.board-img').attr('data-src'),
            'star':item.find('.star').text(),
            'time':item.find('.releasetime').text().strip(),#strip()转化为字符串去除前后空格,strip()[3:]表示从取下标从3的位置开始到文件结尾
            'score':item.find('.score').find('.integer').text().strip()+item.find('.score').find('.fraction').text().strip(),
        }

def write_to_file(item): #接收一个字典
    writer.writerow((item['rank'],item['name'],item['img'],item['star'],item['time'],item['score']))

def main():
    for i in range(10):
        url='https://maoyan.com/board/4?offset='+str(i*10)
        doc=get_page(url)
        #print(doc)
        for item in parse_page(doc):
            print(item)
            write_to_file(item)
        #线程推迟1s,一些反爬取网站,如果速度过快会无响应,故增加一个延时等待
        time.sleep(1)

if __name__ == '__main__':
    f = open('test.csv', 'a', newline='', encoding='utf-8')
    writer = csv.writer(f)
    writer.writerow(('Rank','Name','Picture','Star','Time','Score'))#写入头部信息
    main()
    f.close() #手动关闭文件对象
    end=time.clock() #添加程序结束时间
    # 输出CPU耗时,不包括线程推迟的时间,是正常情况下(不考虑等待)程序的耗时
    print("爬取完毕,CPU耗时:%f s"%(end-begin))

使用文本txt格式存储

'''pyquery get the data and save as txt'''
import json
import time
import requests
from pyquery import PyQuery as pq

def get_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
    }
    doc=pq(url)
    return doc

def parse_page(doc):

     dd=doc('.board-wrapper').find('dd')

     for item in dd.items():
         yield {
             'index': item.find('.board-index').text(),
             'image': item.find('.board-img').attr('data-src'),
             'title': item.find('.name').text(),
             'actor': item.find('.star').text().strip()[3:],
             'time': item.find('.releasetime').text(),
             'score': item.find('.score').find('.integer').text().strip() + item.find('.score').find(
                 '.fraction').text().strip()
         }

def write_to_file(item):
    with open('test.csv','a',encoding='utf-8') as f:
        f.write(json.dumps(item,ensure_ascii=False)+'\n')#False表示不使用ascii表示中文,可以直接显示中文

def main():
    for i in range(10):
        url = 'https://maoyan.com/board/4?offset='+str(i*10)
        doc=get_page(url)
        for item in parse_page(doc):
            print(item)
            write_to_file(item)

原文地址:https://www.cnblogs.com/sstealer/p/11393524.html

时间: 2024-10-26 21:22:42

# [爬虫Demo] pyquery+csv爬取猫眼电影top100的相关文章

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'

爬虫实战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 = [] #

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 将抓到的数据写入本地文件

使用requests爬取猫眼电影TOP100榜单

Requests是一个很方便的python网络编程库,用官方的话是"非转基因,可以安全食用".里面封装了很多的方法,避免了urllib/urllib2的繁琐. 这一节使用requests库对猫眼电影的TOP100榜进行抓取. 1 获得页面. 首先确定要爬取的url为http://maoyan.com/board/4,通过requests模块,打印出页面的信息 def get_a_page(url): try: response = requests.get(url) if respon

Python爬虫实战之Requests+正则表达式爬取猫眼电影Top100

import requests from requests.exceptions import RequestException import re import json # from multiprocessing import Pool # 测试了下 这里需要自己添加头部 否则得不到网页 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Ge

爬虫练习 | 爬取猫眼电影Top100

#coding=utf-8 _date_ = '2018/12/9 16:18' import requests import re import json import time def get_one_page(url): headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537

Requwsts+正则表达式爬取猫眼电影Top100

流程框架: 抓取单页内容:利用requests请求目标站点,得到单个网页HTML代码,返回结果. 正则表达式分析:根据HTML代码分析得到电影和名称.主演.上映时间.评分.图片链接等信息. 开启循环及多线程:对多页内容遍历,开启多线程提高抓取速度. 保存至文件:通过文件的形式将内容结果保存,每一部电影一个结果一行Json字符串. 原文地址:https://www.cnblogs.com/779084229yyt/p/9692010.html

20170513爬取猫眼电影Top100

import jsonimport reimport requestsfrom bs4 import BeautifulSoupfrom requests import RequestExceptionfrom multiprocessing import Pooldef get_one_page(url): headers = {'User-Agent':'baiduspider+'} try: response = requests.get(url,headers=headers,timeo