爬虫从头学之Requests+正则表达式爬取猫眼电影top100

爬取思路

当我们想要爬取一个页面的时候,我们要保证思路清晰,爬虫的思路分四个步骤,发起请求获取响应内容解析内容存储内容。根据这四个内容我们的思路就很清晰。以下为具体步骤

  1. 使用requests库爬出单页内容
  2. 根据返回值使用正则表达式分析
  3. 保存至文件
  4. 对目标网站进行循环以及多线程爬取

项目实战部分

  1. 使用requests库爬出单页内容

    爬取url:http://maoyan.com/board/4?

    猫眼对爬虫有一个反爬虫策略,如果请求头没有模仿为浏览器的请求头会出现禁止访问,所以这里我们设置请求头。

    
    # 获取页面
    
    def get_one_page(url):
       # 反爬虫,设置用户请求头
       header = {
           'User-Agent' : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
       }
       # 得到网页地址的内容
       try:
           response = requests.get(url,headers = header)
           if response.status_code == 200:
               return response.text
           return None
       except RequestException:
           return None
  2. 根据返回值使用正则表达式分析

    上一步,我们通过requests库爬取目标网页的所有内容,可是我们需要的是去除HTML标签后的部分信息,怎么办呢,正则表达式派上用场了。这部分主要是正则表达式的书写,所以学会爬虫,一个重要的点就是正则表达式,使用正则匹配完页面所有的相符合内容后,使用yield生成器对正则匹配到的信息进行处理。

    
    # 解析页面
    
    def parse_one_page(html):
       pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a.*?>(.*?)</a>'
                            '.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">'
                            '(.*?)</i>.*?</dd>',re.S)
    
       itmes = re.findall(pattern,html);
       for itme in itmes:
           yield {
               'index': itme[0],
               'image': itme[1],
               'title': itme[2],
               'actor': itme[3].strip()[3:],
               'time': itme[4].strip()[5:],
               'score': itme[5]+itme[6]
           }
       # print(itmes)
  3. 保存至文件

    对目标网页的信息处理完成后,我们就需要将其存储到一个文件中,存储为.txt文件,并将编码格式为utf-8,存储完成后关闭文件。

    
    # 存储数据
    
    def write_to_file(content):
       # a参数代表往后追加
       with open('result.txt','a', encoding= 'utf-8') as f:
           # 一个content代表一个item,后面要换行
           f.write(json.dumps(content, ensure_ascii=False) + '\n')
           f.close()

    我们就可以看到result.txt文件,打开文件我们可以看到爬取的排名。

  4. 对目标网站进行循环以及多线程爬取

    最后就是对网站进行循环爬取了,到目前为止,我们只是爬取一个页面,只有10个数据,我们分析下从第一页到最后一页的地址变化

    http://maoyan.com/board/4?offset=90,我们可以发现offset参数是翻页地址的变化原因,这样我们就可以得到从第一页到最后一页的地址。

    
    # offset设置爬取下一页
    
    def main(offset):
       url = 'http://maoyan.com/board/4?offset=' + str(offset)
       html = get_one_page(url)
       # print(html)
       for item in parse_one_page(html):
           write_to_file(item)
           print(item)
    
    
    # 多线程爬取
    
    if __name__ == '__main__':
    
    #    for i in range(10):
    
    
    #         main(i*10)
    
       pool = Pool()
       pool.map(main,[i*10 for i in range(10)])    

好了,使用requests库+正则表达式爬取猫眼电影top100完成了,其实很简单,只要我们多动手做做,多分析具体网址,基本就可以将我们想爬取的网站爬取。

<think>嗯,用户想了解如何使用正则表达式进行爬虫操作,特别是用Python的re模块。首先,我需要回忆一下正则表达式爬虫中的应用场景,比如数据提取、模式匹配等。然后,用户可能需要具体的步骤和示例代码,这样才能跟着操作。 首先,我应该介绍正则表达式的基础概念,比如元字符、量词和分组,这些是构成正则表达式的基本元素。然后,结合Python的re模块,说明如何编译正则表达式使用match、search、findall等方法。用户可能需要知道每个方法的不同用途,比如match是从头匹配,search是搜索整个字符串,而findall是找到所有匹配项。 接下来,给出一个具体的例子会比较有帮助。比如爬取电影信息,假设网页结构里有电影名称、年份和评分,用正则表达式提取这些信息。需要展示如何构造正则表达式模式,处理多行文本,以及如何处理可能的分隔符和空白字符。然后,代码示例应该包括发送HTTP请求获取页面内容,然后应用正则表达式提取数据,最后打印结果。 还要注意用户提到的引用资料,引用1到4都是关于Python爬虫正则表达式的,需要正确对应到回答中的步骤和示例。比如,引用2提到compile函数生成正则表达式对象,应该在步骤里说明这一点。引用3强调正则表达式爬虫中的重要性,可以在引言部分引用。 用户可能遇到的常见问题包括正则表达式编写错误、处理动态加载内容或反爬机制,这些需要在注意事项中提到。同时,要提醒用户正则表达式可能不适合复杂的HTML解析,建议结合BeautifulSoup等使用。 最后,生成相关问题时要围绕用户可能进一步想了解的内容,比如特殊字符处理、应对反爬虫、提取多层嵌套数据,以及正则表达式与其他解析的比较。这些问题可以帮助用户深入学习和解决问题。</think>### 使用正则表达式实现爬虫功能的步骤与示例 #### 一、正则表达式爬虫中的作用 正则表达式(Regular Expression)主要用于**从网页源码中精准提取结构化数据**,例如文本、链接、数字等。在Python中通过`re`模块实现相关功能[^3]。 --- #### 二、核心步骤 1. **获取网页源码** ```python import requests response = requests.get("https://example.com/movies") html_content = response.text ``` 2. **编写正则表达式规则** - **基础语法元素**: - `\d`匹配数字,`\w`匹配字母/数字/下划线 - `.*?`非贪婪匹配任意字符 - `()`定义捕获组 - **示例规则**:提取电影信息 ```python pattern = r&#39;<div class="movie">.*?<h2>(.*?)</h2>.*?年份:(\d{4}).*?评分:(\d\.\d)</div>&#39; ``` 3. **应用正则表达式** ```python import re # 编译正则表达式提升性能[^2] regex = re.compile(pattern, re.S) # re.S允许.匹配换行符 results = regex.findall(html_content) ``` 4. **处理提取结果** ```python for movie in results: print(f"名称:{movie[0]}, 年份:{movie[1]}, 评分:{movie[2]}") ``` --- #### 三、完整示例:提取电影数据 假设目标网页片段: ```html <div class="movie"> <h2>肖申克的救赎</h2> <p>年份:1994</p> <p>评分:9.3</p> </div> ``` Python代码实现: ```python import re import requests url = "https://movie.example.com" html = requests.get(url).text pattern = r&#39;<div class="movie">.*?<h2>(.*?)</h2>.*?年份:(\d{4}).*?评分:(\d\.\d)&#39; matches = re.findall(pattern, html, re.S) for title, year, score in matches: print(f"{title} ({year}), 评分:{score}") ``` 输出结果: ``` 肖申克的救赎 (1994), 评分:9.3 ``` --- #### 四、注意事项 1. **正则表达式调试**:使用在线工具(如regex101.com)验证规则 2. **动态内容限制**:正则表达式无法直接处理JavaScript渲染的内容,需配合Selenium等工具[^4] 3. **反爬策略**:需添加请求头(User-Agent)和延时控制 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值