• 利用requests库和正则表达式爬取猫眼top100的电影信息


    爬取目标:https://maoyan.com/board/4?offset=0

    一、爬取首页

    1 def get_one_page(url):
    2         headers = {
    3             'User - Agent': 'Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 63.0.3239.132Safari / 537.36'
    4         }   #添加user—agent(浏览器信息)
    5         response = requests.get(url,headers=headers)  #爬取指定的URL源码
    6         if response.status_code == 200:      #如果访问正常,返回网站源码
    7             return response.text
    8         return None

    二、正则提取

    正则提取首先要分析网站源代码

     

    需要提取的信息有:排名,图片地址,片名,主演,上映日期和评分

    从代码中可以看出,每个影片信息存放在一个<dd></dd>标签中

    正则匹配时必须加上class名(class名唯一),非必要内容可用非贪婪匹配.*?,提取内容必须用(.*?)放在括号里,方便后面提取

    正则表达式如下:

    <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>
       

    使用compile方法将正则表达式变成正则对象

     1 def parse_one_page(html):
     2     pattern = re.compile(
     3         '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S
     4     )
     5     items = re.findall(pattern,html)
     6     # print(items)
     7     for item in items:       #使显示结果清楚明了
     8         yield{
     9             'index':item[0],
    10             'image':item[1],
    11             'title':item[2].strip(),
    12             'actor':item[3].strip()[3:],
    13             'time':item[4].strip()[5:],
    14             'scroe':item[5].strip()+item[6].strip()
    15         }

     三、写入文件

    使用json库中的dumps()方法实现字典的序列化

    1 def write_to_file(content):
    2     with open('result.txt','a',encoding='utf-8') as f:
    3         print(type(json.dumps(content)))
    4         f.write(json.dumps(content,ensure_ascii=False)+'
    ')     #ensure_ascii设为False,保证输入内容是中文字符而不是Unicode编码

    四、整合代码

    使用main()方法来实现前面实现的方法

    1 def main():
    2     url = 'https://maoyan.com/board/4?offset=' 
    3     html = get_one_page(url)    #爬取首页
    4     for item in parse_one_page(html):     #解析首页,正则提取
    5         write_to_file(item)    #写入文件

    五、分页爬取

    每页的网址:'https://maoyan.com/board/4?offset=' + str(offset),等号后面为n * 10,n为整数,为零是第一页,为10时,第二页,以此类推
    完整代码如下:
     1 import requests
     2 import re
     3 import json
     4 import time
     5 from requests.exceptions import RequestException
     6 
     7 def get_one_page(url):
     8     try:
     9         headers = {
    10             'User - Agent': 'Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 63.0.3239.132Safari / 537.36'
    11         }
    12         response = requests.get(url,headers=headers)
    13         if response.status_code == 200:
    14             return response.text
    15         return None
    16     except RequestException:
    17         return None
    18 
    19 def parse_one_page(html):
    20     pattern = re.compile(
    21         '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S
    22     )
    23     items = re.findall(pattern,html)
    24     # print(items)
    25     for item in items:
    26         yield{
    27             'index':item[0],
    28             'image':item[1],
    29             'title':item[2].strip(),
    30             'actor':item[3].strip()[3:],
    31             'time':item[4].strip()[5:],
    32             'scroe':item[5].strip()+item[6].strip()
    33         }
    34 
    35 def write_to_file(content):
    36     with open('result.txt','a',encoding='utf-8') as f:
    37         print(type(json.dumps(content)))
    38         f.write(json.dumps(content,ensure_ascii=False)+'
    ')
    39 
    40 def main(offset):
    41     url = 'https://maoyan.com/board/4?offset=' + str(offset)
    42     html = get_one_page(url)
    43     for item in parse_one_page(html):
    44         write_to_file(item)
    45 
    46 if __name__ == '__main__':
    47     for i in range(10):
    48         main(offset=i * 10)
    49         time.sleep(1)

    六、爬取结果



  • 相关阅读:
    作业2(4)求m和n之间的和
    作业2(3)计算x的n次方
    作业3(6)查询水果的单价。有 4 种水果,苹果(apples)、梨(pears)、桔子(oranges)和葡萄(grapes),
    作业3(5)输入五级制成绩(A-E),输出相应的百分制成绩(0-100)区间,要求使用 switch语句。
    作业3(4)循环输入多个年份 year,判断该年是否为闰年。判断闰年的条件是:能被 4 整除但不能被100 整除,或者能被 400 整除。输入-1退出程序执行
    P39-习题2-5
    P39-习题2-7
    计算N户电费
    P39-习题2-4
    P39-习题2-3
  • 原文地址:https://www.cnblogs.com/houyu/p/11144586.html
Copyright © 2020-2023  润新知