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

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

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

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. SSM自学笔记(一)

    本文内容 Ioc和DI Spring快速入门 Spring配置文件 Spring IoC和DI注解开发 Spring配置数据源 Spring注解开发 Spring整合Junit IoC 和 DI 1. ...

  2. tcphdr结构

    包含在/usr/src/linux/include/linux/tcp.h 1 struct tcphdr { 2 __be16 source; 3 __be16 dest; 4 __be32 seq ...

  3. Struts2与Hibernate整合

    时间:2017-1-26 02:00 1.创建一个Web项目2.导入jar包    3.引入配置文件    struts.xml    hibernate.cfg.xml    log4j.prope ...

  4. VS code快速创建vue模板

    忘记了.vue文件的格式或者不想手动敲那段模板代码怎么办?VS code快速创建vue模板帮你偷个小懒 第一步:新建模板并保存 打开 VS code,依次点击 file > Preference ...

  5. Python - 面向对象编程 - 实例方法、静态方法、类方法

    实例方法 在类中定义的方法默认都是实例方法,前面几篇文章已经大量使用到实例方法 实例方法栗子 class PoloBlog: def __init__(self, name, age): print( ...

  6. ES6扩展——函数扩展之默认参数

    1.函数的默认参数 //函数的默认参数 function add(a, b = 999){ console.log(a,b); //1 999 } add(1); 2. 函数的形参可以设置默认值,默认 ...

  7. 移动端 uni-app 滑动事件 精确判断手指滑动方向

    移动端根据手指滑动操作判断滑动方向 设计思路: 1.根据移动端touchstart和touchend方法获取手指触摸屏幕的开始坐标和结束坐标 2.根据两个坐标计算与水平方向的夹角 3.根据夹角判断当前 ...

  8. 手撕LRU缓存了解一下

    面试官:来了,老弟,LRU缓存实现一下? 我:直接LinkedHashMap就好了. 面试官:不要用现有的实现,自己实现一个. 我:..... 面试官:回去等消息吧.... 大家好,我是程序员学长,今 ...

  9. python variable scope 变量作用域

    python 中变量的作用域经常让我感到很迷 In Python, on the other hand, variables declared in if-statements, for-loop b ...

  10. 基于Appium,封装自己的常用方法

    Appium算是老牌移动端App自动化测试工具了,在使用它的过程中,使用者经常会根据个人习惯,把较常用的方法封装在一起,方便调用.以下是我的封装,希望对你有启发. from typing import ...