Python爬虫实战—2345影视获取经典电影信息

news/2024/5/19 1:12:20 标签: python, 强化学习, xmlhttprequest

爬虫提前准备包
1)安装解析库lxml
lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。
命令行进行安装:pip install lxml
2)requests库,安装:pip install requests

获取信息user-agent
User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

使用User-Agent可以将爬虫模拟成用户操作计算机,防止爬虫被封。而短时间进行大量访问也有可能被封掉,而自动生成UA可以有效解决这个问题。

进入2345影视:控制台打开获取user-agent
在这里插入图片描述
爬取2345影视经典电影信息,代码块如下

python">#coding:utf-8
import requests
from lxml import etree
from urllib.parse import urljoin  #url拼接
from getcsv import getcsv
def  get_html(url):
    '''
    获取源代码
    :param url:
    :return:
    '''
    headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36"}
    response=requests.get(url,headers=headers)
    #response是2开头,即返回response,否则返回None
    return response.text if str(response.status_code).startswith("2") else None
def get_detail_url_list(url):
    '''
    获取电影详情页url
    :param url:
    :return:
    '''
    #获取页面
    html=get_html(url)
    #如果没有获取页面,返回为空
    if not html:
        print("Response状态码不是200")
        return
    #解析获取的页面
    parser=etree.HTML(get_html(url))
    #获取详情页面的url
    detail_urls=[urljoin(url,i) for i in parser.xpath("//ul[contains(@class,'v_picTxt')]/li/div[@class='pic']/a/@href")]
    #翻页去最后一页
    next_page_tag=parser.xpath("//div[@class='v_page']/a[last()]")
    #到最后一页,获取最后一页
    if next_page_tag:
        next_page_tag=next_page_tag[0]
    #如果next_page_tag文本有下一页(最后页是由下一页),就返回路径,否则返回为空
    next_page_url=urljoin(url,next_page_tag.attrib.get("href")) if "下一页" in next_page_tag.text else None
    return next_page_url,detail_urls

def parse_detail(url):
    '''
    解析详情页的url
    xpath定位是从1开始的
    :param url:
    :return:
    '''
    html = get_html(url)
    if not html:
        print("Response状态码不是200")
        return
     #获取信息路径
    Etree=etree.HTML(html)
    title = "".join(Etree.xpath("//div[@class='tit']/h1/text()"))
    # print(type(title))
    score = Etree.xpath("//div[@class='tit']/p/em/text()")[0].replace("分", "")
    actor = " ".join(Etree.xpath("//ul[contains(@class,'txtList')]/li[contains(@class,'liActor')]/a/text()"))
    director = "".join(Etree.xpath("//ul[contains(@class,'txtList')]/li[@class='li_3']/a/text()"))
    introduction = "".join(Etree.xpath("//ul[contains(@class,'newIntro')]/li/p/span/text()"))
    # 多个list合并成一个list
    list = [title,actor,director,introduction]
    #一个大的list每4个分割成1个list
    lists=list_split(list,4)
    # print(title)
    return lists
#切割列表
def list_split(items, n):
    return [items[i:i+n] for i in range(0, len(items), n)]
def spider():
    next_url = "https://dianying.2345.com/list/jingdian------.html"
    datas=[]
    # 详情页,下一页结果
    while next_url:
        next_url, urls = get_detail_url_list(next_url)
        # print(urls)
        # print(type(urls))
        for url in urls:
            # print(url)
            #添加数据在数组datas
            datas.extend(parse_detail(url))
        # return parse_detail(url)
    return datas



if __name__ == '__main__':
    import time
    datas1=spider()
    path = 'data.csv'
    title = ['电影名', '演员', '导演', '简介']
    w_data = getcsv().write_csv(path, title, datas1)


getcsv.py 代码块如下:

python">#coding:utf-8
import csv
import os
#利用pandas包来按照列写入csv文件
import pandas as pd

class getcsv:
    def write_csv(self,file_path,title,datas):
        with open(file_path, 'a', encoding='utf-8', newline='') as f:
            # rows=f.readlines()
            # for row in rows:
            try:
                csv_write = csv.writer(f, dialect='excel')
                # 写入列名
                csv_write.writerow(title)
                # 写入多行
                csv_write.writerows(datas)
            except FileNotFoundError as e:
                print('指定的文件无法打开')
            except IOError as e:
                print(e)
                print("文件写入错误")

学习资料:https://ke.qq.com/webcourse/index.html#cid=396790&term_id=100473305&taid=3423527021972982&vid=5285890799988610488


http://www.niftyadmin.cn/n/1500720.html

相关文章

[java设计模式简记] 策略模式(Strategy-Pattern)

策略模式(Strategy-Pattern) 将一系列行为封装成算法,并可以替代 意图: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。主要解决: 在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。何时使用…

Linux - 文件 合并 分割 去重

为什么80%的码农都做不了架构师?>>> Linux 文件 合并 拆分 1. 两个文件的交集,并集 2. 两个文件合并 3. 一个文件去掉重复的行: 4. 将一个大的文件分割成多个小文件 1. 两个文件的交集,并集 前提条件:每个…

Fiddler工具—模拟接口响应数据

1 为什么要模拟数据 1.解耦 2.前后端并行开发 2 实现原理 模拟响应数据的实现主要是通过使用fiddler工具抓取服务器响应给了浏览器A请求的数据内容A,对数据A进行更新成指定的数据B,然后fidder作为代理服务器把修改后的B数据响应给浏览器的A请求。 3 …

Fiddler工具—接口测试操作步骤

1)在页面右侧面板,选择Composer,输入接口测试数据,详细步骤见截图 2)检查请求接口返回的数据

带你3分钟学会 Python 模块和包的使用

模块和包 目标 模块包发布模块 01. 模块 1.1 模块的概念 模块是 Python 程序架构的一个核心概念 每一个以扩展名 py 结尾的 Python 源代码文件都是一个 模块模块名 同样也是一个 标识符,需要符合标识符的命名规则在模块中定义的 全局变量 、函数、类 都是提供给…

Pyhton接口自动化—封装get、post方法

#coding:utf-8 import requests #执行get、post方法封装 class RunMethod:def __init__(self,method,url,dataNone,headerNone):self.resself.run_main(method,url,data,header)def post_main(self,url,data,headerNone):resNoneif header!None:resrequests.post(urlurl, datad…

CSS简单布局总结

display block 块级元素,占据一行 none 隐藏 inline 允许同一行显示,但不再有宽和高 inline-block 允许在一行的块级元素,可以有宽和高 例如,把所有a元素设置成10050的块级元素: a{display: block…

java中的单例模式与静态类

单例模式与静态类(一个类,所有方法为静态方法)是另一个非常有趣的问题,在《Java中有关单例模式的面试问题》博文中露掉了,由于单例模式和静态类都具有良好的访问性,它们之间有许多相似之处,例如…