一、工具:
scrapy框架
numpy
PIL : Image, ImageDraw, ImageFont
fontTools.ttLib :TTFont
lxml : html
二、分析过程:
1、列表页面
因为想要把想要的数据渲染,所以不能只爬取一个页面的数据,从列表跳转到详情页面 要传递id值,确保跳转到指定详情页面:列表页面需要获取的数据如下:
2、详情页面
详情页面需要获取的数据如下:加密部分需要单独处理
先把数据库的字段拿过来,明确要获取的数据
items.py
class MyfilmItem(scrapy.Item):
table = "mydy"
film_id = scrapy.Field() # 电影id
thumb = scrapy.Field() # 电影缩略图
cname = scrapy.Field() # 电影中文名
time = scrapy.Field() # 上映时间
score = scrapy.Field() # 用户评分
score_num = scrapy.Field() # 评分人数
ticketNumber = scrapy.Field() # 票房数
ename = scrapy.Field() # 电影英文名
length = scrapy.Field() # 电影时长
tickets_unit = scrapy.Field() # 票房单位
type = scrapy.Field() # 电影类型
开始获取数据,因为总是302 301的错误,获取不到页面,需要重写url,头信息和cookie的值要写全,完全正确,settings中COOKIES_ENABLED = False 开启cookie
参考文档:https://blog.csdn.net/qq_38949193/article/details/81410582
去重scrapy 在迭代爬取时被拒 offsite 增加dont_filter=True
参考地址:https://www.cnblogs.com/yijiaming/p/9759027.html
cookie还是一样的 先找哪些是猫眼要的值,再加全!
cookies = {
"_csrf":"查看浏览器中你自己的cookie对应值",
"_lxsdk":"查看浏览器中你自己的cookie对应值",
"_lxsdk_cuid":"查看浏览器中你自己的cookie对应值",
"mojo-uuid":"查看浏览器中你自己的cookie对应值",
"uuid":"查看浏览器中你自己的cookie对应值",
"uuid_n_v":"v1"
}
获取数据id值需要注意一下,一个是跳转页面用,一个试传递id值
获取下一页 获取当前所处页数,是否有下一页
只要数字,需要处理str().splice("_")[1]
获取下一页拼接路径,拼接下一页访问地址
电影类型试多个,在列表里,需要转一下。电影时长有下一行等符号,需要转str处理 跟之前获取评论时候处理数据一样
获取详情需要解密部分数据参考地址:http://ddrv.cn/a/191931
思路:
先请求页面的字体下载,之前做的大众点评是就那几种字体下载完循环用就行,这个是要访问一次下载一个,下载之后整理对应的字典,下载之后保存到自己的项目中,再打开保存好的字体文件,用绘制的方法绘制成图片,打开图片再获取绘制好的图片的文字。形成数字与字符的字典,获取页面中字符,判断字符在字典中进行替换,得到想要的加密数据:
总结:在原来大众点评获取字体的基础上加上绘图再识别绘图文字,进行对比!
上代码:
maoyan.py
# -*- coding: utf-8 -*-
import json
import numpy
import os
import re
import requests
import scrapy
from PIL import Image, ImageDraw, ImageFont
from fontTools.ttLib import TTFont
from lxml import html
# 创建etree模块
from pytesseract import image_to_string
from myfilm import settings
from myfilm.items import MyfilmItem
etree = html.etree
from scrapy import Request
class MaoyanSpider(scrapy.Spider):
name = 'maoyan'
allowed_domains = ['maoyan.com']
# start_urls = ['http://maoyan.com/']
fontstr = ""#定义一个字体文件的字符串
headers = {
#此处为你自己的浏览器版本
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
}
#cookie的值上面有相应需求整理,我放到了settings中
cookies = settings.cookies
def start_requests(self):
'''
重写start_requests函数
:return:
'''
urllist = [
'https://maoyan.com/films?showType=3'
]
for url in urllist:
yield Request(url=url,headers=self.headers, cookies=self.cookies, callback=self.parse)
def parse(self, response):
'''
解析电影列表页面
:param response:
:return:
'''
##获取列表
ddlist = response.xpath("//div[@class='container']//div[@class='movies-panel']//dl[@class='movie-list']//dd")
##遍历获取每个电影的信息
for dd in ddlist:
filmdic = {
"id": dd.xpath(".//div[@class='movie-item']//a//@href").get() or "",
"film_id": str(dd.xpath(".//div[@class='movie-item']//a//@href").get()).split('/')[2] or "",
"cname": dd.xpath(".//div[contains(@class,'movie-item-title')]//a//text()").get() or "null",
"thumb": dd.xpath(".//div[@class='movie-item']//a//img[last()]//@data-src").get() or "default",
"score": dd.xpath(".//div[contains(@class,'channel-detail-orange')]//text()").get() or "0",
}
# print("filmdic=====",filmdic)