使用 进程池Pool 提高爬取数据的速度。

 1 # !/usr/bin/python
2 # -*- coding:utf-8 -*-
3 import requests
4 from requests.exceptions import RequestException
5 import re
6 import json
7 from multiprocessing import Pool,Lock
8
9
10 # 获取单页数据信息;
11 def get_one_page(url, headers):
12 try:
13 response = requests.get(url, headers=headers)
14 if response.status_code == 200:
15 return response.text
16 return None
17 except RequestException:
18 return None
19
20 # 使用正则表达式解析数据;
21 def parse_one_page(html):
22 pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a.*?>'
23 +'(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">'
24 +'(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
25 items = re.findall(pattern, html)
26 # 将获取的数据以字典形式返回;
27 for item in items:
28 yield {
29 'index': item[0],
30 'image': item[1],
31 'title': item[2],
32 'actor': item[3].strip()[3:],
33 'time': item[4].strip()[5:],
34 'score': item[5]+item[6]
35 }
36
37 # 将字典转换为字符串保存,
38 def write_to_file(content):
39 lock.acquire()
40 with open('result.txt', 'a', encoding="utf-8") as f:
41 f.write(json.dumps(content, ensure_ascii=False) + "\n")
42 f.close()
43 lock.release()
44
45 def init(l):
46 global lock
47 lock = l
48
49 # 传入爬取链接,运行函数;
50 def main(offset):
51 url = "https://maoyan.com/board/4?offset=" + str(offset)
52 headers = {
53 "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
54 }
55 html = get_one_page(url, headers=headers)
56 for item in parse_one_page(html):
57 write_to_file(item)
58
59 if __name__ == '__main__':
60 # for i in range(10):
61 # main(i*10)
62 # 使用 进程池 提高爬取速度;
63 lock = Lock()
64 Pool = Pool(initializer=init, initargs=(lock,))
65 Pool.map(main, [i*10 for i in range(10)])

python限定了多进程要调用的函数不能是类方法,需把多进程调用的函数放到类外面,或者变成静态函数。

但静态函数不能被该类的方法调用( self.ProcessWorker  形式),需在外部调用:如 mc = MyClass(), mc.ProcessWorker 或 MyClass().ProcessWorker 。

python 多进程编程中进程池锁共享问题参考博客:https://blog.csdn.net/qq_27292549/article/details/78929296

# 将数组中的每个元素提取出来当作函数的参数,创建一个个进程,放进进程池中;
# 第一个参数是函数,第二个参数是迭代器,将迭代器中的数字作为参数依次传入函数中

requests + 正则表达式 获取 ‘猫眼电影top100’。的更多相关文章

  1. requests+正则表达式提取猫眼电影top100

    #requests+正则表达式提取猫眼电影top100 import requests import re import json from requests.exceptions import Re ...

  2. 1.requests+正则表达式爬猫眼电影TOP100

    import requests from requests.exceptions import RequestException def get_one_page(url):try: response ...

  3. 使用requests爬取猫眼电影TOP100榜单

    Requests是一个很方便的python网络编程库,用官方的话是"非转基因,可以安全食用".里面封装了很多的方法,避免了urllib/urllib2的繁琐. 这一节使用reque ...

  4. 利用多进程获取猫眼电影top100

    猫眼电影top100 是数据是在加载网页时直接就已经加载了的,所以可以通过requests.get()方法去获取这个url的数据,能过对得到的数据进行分析从而获得top100的数据, 把获取的数据存入 ...

  5. Python爬虫之requests+正则表达式抓取猫眼电影top100以及瓜子二手网二手车信息(四)

    requests+正则表达式抓取猫眼电影top100 一.首先我们先分析下网页结构 可以看到第一页的URL和第二页的URL的区别在于offset的值,第一页为0,第二页为10,以此类推. 二.< ...

  6. PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)

    利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...

  7. 用requests库爬取猫眼电影Top100

    这里需要注意一下,在爬取猫眼电影Top100时,网站设置了反爬虫机制,因此需要在requests库的get方法中添加headers,伪装成浏览器进行爬取 import requests from re ...

  8. 爬虫练习之正则表达式爬取猫眼电影Top100

    #猫眼电影Top100import requests,re,timedef get_one_page(url): headers={ 'User-Agent':'Mozilla/5.0 (Window ...

  9. Python爬虫项目--爬取猫眼电影Top100榜

    本次抓取猫眼电影Top100榜所用到的知识点: 1. python requests库 2. 正则表达式 3. csv模块 4. 多进程 正文 目标站点分析 通过对目标站点的分析, 来确定网页结构,  ...

随机推荐

  1. 15.SpringMVC之异步请求

    SpringMVC中异步请求相关组件 SpringMVC在此基础上对异步请求进行了封装.提供了AsyncWebRequest类型的request,并提供了处理异步请求的管理器WebAsyncManag ...

  2. Python打印图片

    准备好图片:(我女票) python代码: # by gubin 6.20 from dyy from PIL import Image import sys import os def _main( ...

  3. 转:C语言自增自減问题总结

    C语言自增自減问题总结 在程序设计中,经常遇到"i=i+1"和"i=i-1"这两种极为常用的操作.C语言为这种操作提供了两个更为简洁的运算符,即++和--,分别 ...

  4. mybatis根据表逆向自动化生成代码(自动生成实体类、mapper文件、mapper.xml文件)

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  5. rabbitMq内存与磁盘分配问题

    在服务器上也可以改变配置文件修改内存 也可以使用命令进行分配: 相对内存:rabbitmqctl  set_vm_memory_hgih_waterwmark 0.4     使用时可以把这个0.4替 ...

  6. 华为分析X HUAWEI Ads,上线深度转化事件回传功能,让ROI 看得见!

    华为分析X HUAWEI Ads,上线深度转化事件回传功能,让ROI 看得见! 随着移动应用生态的流量成本攀升.行业竞争加剧,越来越多的广告商希望通过精准投放来获取更高质量的深度转化用户,比如二手车. ...

  7. VSCode——滚动鼠标控制字体大小

    第一步:找到设置 文件-->首选项-->设置 第二步:打开settings.json文件 第三步:在settings.json文件中添加 "editor.mouseWheelZo ...

  8. Appium问题解决方案(9)- Original error: Failed to launch Appium Settings app: Condition unmet after 5090 ms

    背景 执行代码报错 解决方法 该问题并不常见,主要是手机操作系统的问题 程序无法无法自动打开appiumsettings,那么我们可以手动打开appiumsettings服务(程序没有界面,会出现打开 ...

  9. IKEv2协议协商流程: (IKE-SA-INIT 交换)第一包

    文章目录 1. IKEv2 协商总体框架 2. 第一包流程图 3. openswan源码学习 3.1 ikev2parent_outI1() 3.2 ikev2parent_outI1_withsta ...

  10. AntDesign VUE:Model组件的Button的事件this指向undefined的问题(箭头函数)

    问题 一个很简单的this指向问题引起的报错: 记录下来主要是想看看这玩意到底指向哪里: 真不戳 解决方法 ES6的箭头函数,有人理解它就是没有this指向,我个人理解是它的this指向函数体的上一级 ...