from concurrent.futures import ProcessPoolExecutor

import requests

import time,re,json

from lxml.html import etree

def down_load_page_data(url):

"""

执行任务的下载

:param url

:return:

"""

response,cur_page = download_page_data(url)

data_dict = {'data':response.text,'page':cur_page}

#获取下一页

if cur_page != 1:

if isinstance(response.json(),list):

next_page = cur_page+1

next_url = re.sub('page=\d+','page='+str(next_page),url)

else:

print('已获取到'+str(cur_page)+'页','没有数据了',response.json())

next_url = None

pass

elif cur_page == 1:

next_page = cur_page + 1

next_url = re.sub('page=\d+', 'page=' + str(next_page), url)

print('====', cur_page)

return data_dict,next_url

def download_page_data(url):

"""

下载每一个分页的数据

:param url: 每一个分页的url地址

:return:

"""

#http://date.jiayuan.com/eventslist_new.php?

# page=1&city_id=4201&shop_id=33

pattern = re.compile('.*?page=(\d+)&city_id=(\d+)&shop_id=(\d+)')

result = re.findall(pattern,url)[0]

cur_page = result[0]

DATE_SHOW_LOC = result[1]

DATE_SHOW_SHOP = result[2]

print(cur_page,DATE_SHOW_SHOP,DATE_SHOW_LOC)

cookie = """_gscu_1380850711=43812116hs5dyy11; accessID=20181222071935501079; jy_refer=www.baidu.com; _gscbrs_1380850711=1; PHPSESSID=9202a7e752f801a49a5747832520f1da; plat=date_pc; DATE_FROM=daohang; SESSION_HASH=61e963462c6b312ee1ffacf151ffaa028477217d; user_access=1; uv_flag=124.64.18.38; DATE_SHOW_LOC=%s; DATE_SHOW_SHOP=%s""" % (DATE_SHOW_LOC,DATE_SHOW_SHOP)

# print(cookie)

req_header = {

'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',

'Cookie':cookie,

'Referer':'http://date.jiayuan.com/eventslist.php',

}

# cookie_dict = {sub_str.split('=')[0]:sub_str.split('=')[1] for sub_str in cookie.split('; ')}

# print(cookie_dict)

#cookies(cookiejar object or dict)

response = requests.get(url,headers=req_header)

if response.status_code == 200:

print('第'+cur_page+'页获取成功',DATE_SHOW_SHOP,DATE_SHOW_LOC)

return response,int(cur_page)

def parse_page_data(futures):

"""

step1:获取到下一页的url地址,继续网进程池中添加任务

strp2:获取到分页的页面源码,进行数据的解析

:param futures:

:return:

"""

result = futures.result()

data = result[0]

next_page_url = result[1]

print(data,next_page_url)

if next_page_url:

print('正在天加任务',next_page_url)

handler = page_pool.submit(down_load_page_data, next_page_url)

handler.add_done_callback(parse_page_data)

page = data['page']

html = data['data']

# 创建进程池(获取活动详情的页面源码)

detail_pool = ProcessPoolExecutor(3)

if page == 1:

print('解析第一页数据,静态页面')

html_element = etree.HTML(html)

hot_active = html_element.xpath('//div[@class="hot_detail fn-clear"]')

for hot_div in hot_active:

# 活动详情的url地址

full_detail_url = 'http://date.jiayuan.com' + hot_div.xpath('.//h2[@class="hot_title"]/a/@href')[0]

detail_handler = detail_pool.submit(download_detail_data,full_detail_url)

detail_handler.add_done_callback(parse_detail_data)

more_active = html_element.xpath('//ul[@class="review_detail fn-clear t-activiUl"]/li')

for more_li in more_active:

# 活动详情的url地址

full_detail_url = 'http://date.jiayuan.com' + more_li.xpath('.//a[@class="review_link"]/@href')[0]

detail_handler = detail_pool.submit(download_detail_data, full_detail_url)

detail_handler.add_done_callback(parse_detail_data)

else:

print('解析第' + str(page) + '数据', '非静态页面')

# 使用json.loads()将json字符串转换为python数据类型

json_obj = json.loads(html)

if isinstance(json_obj, list):

# 是列表,说明得到的是正确的数据,

print('正在解析数据')

for sub_dict in json_obj:

id = sub_dict['id']

# http://date.jiayuan.com/activityreviewdetail.php?id=11706

full_detail_url = 'http://date.jiayuan.com/activityreviewdetail.php?id=%s' % id

detail_handler = detail_pool.submit(download_detail_data, full_detail_url)

detail_handler.add_done_callback(parse_detail_data)

def download_detail_data(url):

"""

根据活动详情的url地址发起请求

:param url:

:return:

"""

req_header = {

'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',

'Cookie': '_gscu_1380850711=43812116hs5dyy11; accessID=20181222071935501079; jy_refer=www.baidu.com; _gscbrs_1380850711=1; PHPSESSID=9202a7e752f801a49a5747832520f1da; plat=date_pc; DATE_FROM=daohang; SESSION_HASH=61e963462c6b312ee1ffacf151ffaa028477217d; user_access=1; uv_flag=124.64.18.38; DATE_SHOW_LOC=50; DATE_SHOW_SHOP=5',

'Referer': 'http://date.jiayuan.com/eventslist.php',

}

response = requests.get(url, headers=req_header)

if response.status_code == 200:

print('详情页面获取成功',response.url)

return response

def parse_detail_data(futures):

"""

解析活动详情

:param response:

:return:

"""

response = futures.result()

html_element = etree.HTML(response.text)

# 创建一个字典,存放获取的数据

item = {}

# 活动标题

item['title'] = ''.join(html_element.xpath('//h1[@class="detail_title"]/text()')[0])

# 活动时间

item['time'] = ','.join(

html_element.xpath('//div[@class="detail_right fn-left"]/ul[@class="detail_info"]/li[1]//text()')[0])

# 活动地址

item['adress'] = html_element.xpath('//ul[@class="detail_info"]/li[2]/text()')[0]

# 参加人数

item['joinnum'] = html_element.xpath('//ul[@class="detail_info"]/li[3]/span[1]/text()')[0]

# 预约人数

item['yuyue'] = html_element.xpath('//ul[@class="detail_info"]/li[3]/span[2]/text()')[0]

# 介绍

item['intreduces'] = html_element.xpath('//div[@class="detail_act fn-clear"][1]//p[@class="info_word"]/span[1]/text()')[0]

# 提示

item['point'] = html_element.xpath('//div[@class="detail_act fn-clear"][2]//p[@class="info_word"]/text()')[0]

# 体验店介绍

item['introductionStore'] = ''.join(

html_element.xpath('//div[@class="detail_act fn-clear"][3]//p[@class="info_word"]/text()'))

# 图片连接

item['coverImage'] = html_element.xpath('//div[@class="detail_left fn-left"]/img/@data-original')[0]

with open('shijijiyua.json','a+') as file:

json_str = json.dumps(item,ensure_ascii=False)+'\n'

file.write(json_str)

if __name__ == '__main__':

#创建一个进程池,执行分页任务下载

page_pool = ProcessPoolExecutor(4)

start_urls = [

'http://date.jiayuan.com/eventslist_new.php?page=1&city_id=4201&shop_id=33',

'http://date.jiayuan.com/eventslist_new.php?page=1&city_id=31&shop_id=15',

'http://date.jiayuan.com/eventslist_new.php?page=1&city_id=3702&shop_id=42',

'http://date.jiayuan.com/eventslist_new.php?page=1&city_id=50&shop_id=5',

]

for url in start_urls:

handler = page_pool.submit(down_load_page_data,url)

handler.add_done_callback(parse_page_data)

python爬虫进程池_python爬虫之进程池爬取(世纪佳缘案例)相关推荐

  1. node爬虫实践:爬取世纪佳缘交友信息

    自从node这一运行在服务端的 JavaScript横空出世以后,赋予了前端开发工程师强大的力量.文件I/O操作,连数据库写接口接口等等.我在刚开始学习的node的时候,尝试着爬了一个比较小的相亲网站 ...

  2. python多线程爬取世纪佳缘女生资料并简单数据分析

    一. 目标 ​ 作为一只万年单身狗,一直很好奇女生找对象的时候都在想啥呢,这事也不好意思直接问身边的女生,不然别人还以为你要跟她表白啥的,况且工科出身的自己本来接触的女生就少,即使是挨个问遍,样本量也 ...

  3. 2019年脱单攻略|用Python爬取世纪佳缘美女照片,实现颜值评分

    "关爱单身程序猿,人人有责" 周末,程序员小明一大早给我发来消息说想找一个女朋友. | 数据探索 于是.... 我登陆了他的账号,摸索着浏览了这个网站 我准备把符合条件的小姐姐的头 ...

  4. python是一种面向对象的高级语言_爬了世纪佳缘后发现了一个秘密,世纪佳缘找对象靠谱吗?...

    今天在知乎上看到一个关于[世纪佳缘找对象靠谱吗?]的讨论,其中关注的人有 1903,被浏览了 1940753 次,355 个回答中大多数都是不靠谱.用 Python 爬取世纪佳缘的数据是否能证明它的不 ...

  5. python交通调查数据处理_Python突破高德API限制爬取交通态势数据+GIS可视化(超详细)...

    一.需求: 爬取高德的交通态势API,将数据可视化为含有交通态势信息的矢量路网数据. 二.使用的工具: Python IDLE.记事本编辑器.ArcGIS 10.2.申请的高德开发者KEY(免费). ...

  6. 基于python的音乐数据分析_Python对QQ音乐进行爬取并进行数据分析

    三方包引入 使用到了以下包: 爬虫 scrapy 网络测试 requests 数据分析 numpy和pandas 绘图 matplotlib和wordcloud pip install scrapy ...

  7. python爬虫进程池_python爬虫之进程池爬虫(世纪佳缘案例)

    from multiprocessing import Process,Queue import requests import re from lxml.html import etree impo ...

  8. python 爬虫热搜_python百度热搜榜爬取

    # terminal中安装库 bs4 requests # pip install bs4 requests import requests from bs4 import BeautifulSoup ...

  9. python扇贝单词书_Python脚本 扇贝单词书爬取

    这是一个·用于爬取扇贝单词书的脚本 将在.py文件目录得到一个名为out.txt的输出文件 主要使用了selenium库(webdriver) 使用方式: 更改 13行中指向webdriver驱动器 ...

最新文章

  1. Maya和Arnold的高级照明实践
  2. 实验3 linux内存映射,3Linux内存映射,mmap()函数
  3. 【转载】说说大型高并发高负载网站的系统架构
  4. [architecture]-ARMV8的ELx等级切换
  5. 判断某棵二叉树是否二叉排序树
  6. C++实现有序表折半查找
  7. npm publish 发布一个 Angular 库的时候报错以及解决方法
  8. divi模板下载_Java Math类静态double IEEEremainder(double divi,double divisor)的示例
  9. Unicode和ANSI之间转换 - NotePad++轻松实现
  10. 花书+吴恩达深度学习(二六)近似推断(EM, 变分推断)
  11. 数字图像处理的发展历史、应用领域、主要来源
  12. Android之drawable下快速生成icon图片vector
  13. 麒麟座IIC-STM32F103RET6(2)-完成US延时
  14. 读理工科研究生的心态
  15. java实现发送手机验证码功能
  16. Actor模式理解与使用
  17. 笑不死算你命大了 逗你开心的笑话
  18. 关于 右键新建选项 假死 死机 卡机 崩溃 闪退 的问题 (含 无法拖拽文件 或者ps无法拖拽等)
  19. 电脑服务器独立显卡显示配置,电脑显卡装完驱动,英伟达显示设置不可用解决方发...
  20. 一起自学SLAM算法:7.4 基于贝叶斯网络的状态估计

热门文章

  1. 3CX邮箱服务器测试出现5.7.0 Denied错误
  2. Generalist: Decoupling Natural and Robust Generalization
  3. chrome JSONView 插件的使用
  4. 淘宝秒杀脚本(python学习笔记)
  5. EWM-ODN 0过账操作步骤
  6. 流体力学(水力学)满分实验报告——流体静力学
  7. 我国古代数学家张邱建在《算经》中出了一道“百钱买百鸡”的问题,题意是这样的:5文钱可以买一只公鸡,3文钱可以买一只母鸡,1文钱可以买3只雏鸡。现在用100文钱买100只鸡,那么各有公鸡、母鸡、雏鸡多少
  8. 老域名有什么好处?老域名如何选择?
  9. 【Windows】使用PowerShell安装vim
  10. JOJ 1064: Caeser Comes Back 解题报告