python爬虫实践记录-爬取猫眼电影排行榜

按步骤来,先打开猫眼电影排行榜首页

python爬虫实践记录-爬取猫眼电影排行榜_第1张图片
查看url,https://maoyan.com/board/4?offset=0
其中offset的数值控制网页页数,起始页值为0,尾页为90
老样子,构造url。

urls = ["https://maoyan.com/board/4?offset=" + str(i*10) for i in range(0 , page_num)]

先定义四个函数,分别用来获取html , 解析html,保存爬取信息,主函数。
请求库使用的是urllib,使用requests库,请求会被Forbbiden,将请求后的网页保存下来打开后显示如下
python爬虫实践记录-爬取猫眼电影排行榜_第2张图片
居然要验证,这就奇了他妈了个怪了逼的,urllib请求是正常的。本来出现这个验证是很兴奋的,毕竟有挑战才有进步,但网上查阅各种资料,没有找到解决的方法,只有一种极验滑动验证码,那个是滑动缺口图片重合主图,和这个不一样,然后就放弃了,以后慢慢研究。
解析库用的是lxml和re,查看源码后,设计了如下的匹配格式

names = html.xpath('//dl[@class = "board-wrapper"]//p[@class = "name"]/a/text()')
timeText = html.xpath('//dl[@class = "board-wrapper"]//p[@class = "releasetime"]/text()')
scores = html.xpath('//dl[@class = "board-wrapper"]//p[@class = "score"]/i[@class = "integer"]/text()')

发现日期文本不是很干净
在这里插入图片描述
使用正则清洗一下,从中挑离日期和国家地区

pat_d = re.compile(r'上映时间:(\d{4}-\d{2}-\d{2})')   # 构造日期正则表达式
pat_n = re.compile(r'上映时间:\d{4}-\d{2}-\d{2}\((.*)\)')  # 构造地区表达式
releaseTime = []    # 定义发行时间列表
nations = []
for t in timeText:      #遍历时间文本
    rt = pat_d.search(t)

    if rt == None:
        releaseTime.append("未知")
    else:
        releaseTime.append(rt.group(1))
    n = pat_n.search(t)           # 匹配国家地区
    if n == None:                 # 值为空,则追加未知
        nations.append("未知")
    else:
        nations.append(n.group(1))          #不为空,追加值

最后保存结果如下:
python爬虫实践记录-爬取猫眼电影排行榜_第3张图片
完整代码:

# -*- coding: utf-8 -*-
"""
@Date: 2020/1/14 11:44
@Author:Shihan Wong
@File: 猫眼电影.py
@Software: PyCharm
"""
import urllib.request
import os
from urllib.error import URLError
import csv
from lxml import etree
import UA_Pool
import re

def getHtml(url):
	this_agent = UA_Pool.get_UA()
	headers = ('user-agent' , this_agent)      #构造报头
	try:
	    opener = urllib.request.build_opener()  # 构造opener
	    opener.addheaders = [headers]  # 添加报头
	    res = opener.open(url).read().decode('utf-8')  # 以打开后以utf-8解码方式读取
	    return res
	
	except URLError as e:
	   print(e,e.reason)
	
def parsePage(html):
    #print(html)
    html = etree.HTML(html)
    # 匹配信息
    names = html.xpath('//dl[@class = "board-wrapper"]//p[@class = "name"]/a/text()')
    timeText = html.xpath('//dl[@class = "board-wrapper"]//p[@class = "releasetime"]/text()')
    scores = html.xpath('//dl[@class = "board-wrapper"]//p[@class = "score"]/i[@class = "integer"]/text()')

    pat_d = re.compile(r'上映时间:(\d{4}-\d{2}-\d{2})')   # 构造日期正则表达式
    pat_n = re.compile(r'上映时间:\d{4}-\d{2}-\d{2}\((.*)\)')  # 构造地区表达式
    releaseTime = []    # 定义发行时间列表
    nations = []
    for t in timeText:      #遍历时间文本
        rt = pat_d.search(t)

        if rt == None:
            releaseTime.append("未知")
        else:
            releaseTime.append(rt.group(1))
        n = pat_n.search(t)           # 匹配国家地区
        if n == None:                 # 值为空,则追加未知
            nations.append("未知")
        else:
            nations.append(n.group(1))          #不为空,追加值
    return (names , scores , releaseTime , nations)        # 返回信息元组
def saveInfo(info):
    # 保存为csv格式文件

    cf = open(r"E:\Desktop\Info.csv", 'a', encoding="utf-8", newline='')  # 打开或创建csv文件
    wr = csv.writer(cf)  # 获取句柄
    for i in range(len(info[0])):
        wr.writerow([str(i +1), info[0][i], info[1][i], info[2][i], info[3][i]])  # 写入文件
    cf.close()


def main():
    page_num = int(input("请输入爬取页数0-10:"))
    urls = ["https://maoyan.com/board/4?offset=" + str(i*10) for i in range(0 , page_num)]
    for url in urls:
        html = getHtml(url)
        info = parsePage(html)
        saveInfo(info)


if __name__ == '__main__':
    main()

那个滑块验证码如果有看到此博客的大佬,希望评论下,好方便我请教一下怎么解决它。

你可能感兴趣的:(爬虫,网络爬虫,python,python,xpath,正则表达式)