爬虫技术:携程爬虫阳光问政数据

携程爬取阳光问帖子:进行了简单的数据存储,数据量共145226条,爬取时间为:3.65小时,时间感觉要多于这个时间。

代码如下:

import time
import gevent
import re
import lxml
import lxml.etree
import requests
import chardet

def get_url_list(url):
    resp = requests.get(url)
    # 获取网页的编码格式,但是gb2312不能编码解码字节类型,只能换成gbk
    code_sytle = chardet.detect(resp.content)
    html_str = resp.content.decode("gbk")
    e = lxml.etree.HTML(html_str)
    count_str = e.xpath("//div[@class=‘pagination‘]/text()")[-1]
    # 获取帖子数量
    count = re.findall("(\d+)", count_str)[0]
    # 获取有多少页
    page_count = int(count) // 30
    url_list = list()
    for i in range(0, page_count + 1):
        url_list.append(url.format(i * 30))
    return url_list

def get_per_page_info(url_list, f):
    for url in url_list:
        try:
            resp = requests.get(url=url,timeout=10)  # 此处容易出现长时间等待,因此加上超时设置
            html_str = resp.content.decode("gbk",errors="ignore")  # 此处容易出现解码错误,因此加上 erros="ignore"
            e = lxml.etree.HTML(html_str)
            tr_list = e.xpath("//div[@class=‘greyframe‘]//table[2]//table//tr")
            info_str = ""
            for tr in tr_list:
                serial_num = tr.xpath(".//td[1]/text()")[0]
                info_str += serial_num
                info_str += " "
                request_type = tr.xpath(".//td[2]//a[1]/text()")[0]
                info_str += request_type
                info_str += " "
                request_reason = tr.xpath(".//td[2]//a[2]/text()")[0]
                info_str += request_reason
                info_str += " "
                duty_department = tr.xpath(".//td[2]//a[3]/text()")[0]
                info_str += duty_department
                info_str += " "
                status = tr.xpath(".//td[3]//span/text()")[0]
                info_str += status
                info_str += " "
                person = tr.xpath(".//td[4]/text()")   # 测试的过程中,此处容易越界,因此加入判断。
                if len(person) == 0:
                    person = "MISS"
                    info_str += person
                else:
                    person = tr.xpath(".//td[4]/text()")[0]
                    info_str += person
                info_str += " "
                time = tr.xpath(".//td[5]/text()")[0]
                info_str += time
                info_str += "\r\n "
            print(info_str)
            f.write(info_str)

        except Exception as e:
            print(e)

if __name__ == ‘__main__‘:
    t = time.time()
    url = "http://wz.sun0769.com/index.php/question/report?page={}"
    url_list = get_url_list(url)
    f = open("sun_info.txt", "w", encoding="utf-8")
    # 任务切割,让10个携程去执行任务,每个携程传递url_list的一部分数据。
    xclist = [[], [], [], [], [], [], [], [], [], []]
    N = len(xclist)
    task_list = list()
    for i in range(len(url_list)):
        xclist[i % N].append(url_list[i])
    for i in range(N):
        task_list.append(gevent.spawn(get_per_page_info, xclist[i], f))

    gevent.joinall(task_list)
    f.close()
    print(time.time() - t)

# 13162.275838851929 执行时间

复习协程的知识:

多线程会抢抢夺公共资源,因此会造成公共资源的不安全,需要通过线程锁进行解决,那么多个携程为什么不存在这个情况呢?

因为多个协程也是在一个线程里面进行运行,只是在遇到IO堵塞操作时候,会自动切换到其他协程,让它们进行工作,此案例中,写入文件是一个IO操作,当一个协程写入文件时阻塞时,立马切换到其他协程进行数据的请求和筛选,合适的时机,在切换(此时应该是用到了上下文了,记录了数据写到哪里被阻塞了,切换回来继续在此处写入,这里概念比较模糊 # TODO 需要继续研究)到刚才读写操作的协程,进行数据写入。

原文地址:https://www.cnblogs.com/meloncodezhang/p/11443580.html

时间: 2024-10-11 05:03:36

爬虫技术:携程爬虫阳光问政数据的相关文章

Python爬虫技术不只是用来抓数据,生活处处需要python

写爬虫抓数据只是爬虫技术的应用方向之一,一个公司可以靠着爬虫技术引来倍增的流量/用户, 完成关键的冷启动,还能用来打败对手:个人可以利用爬虫技术获得被动收入,俗称趟挣. 这篇聊一下公司篇. 定义下爬虫技术 为了抓数据所运用的模拟登录.模拟账号.养IP/账号池.抓包分析.模拟用户访问等技术手段,我们称为爬虫技术. 典型的如:一键发布功能 一个自媒体人会维护多个自媒体平台, 如头条,微信公众号,简书,知乎专栏,搜狐自媒体等等,同一篇稿子会往这十几个平台搬运,靠人去挨个平台编辑耗时耗力,所以衍生出做一

(反反爬虫)携程酒店的eleven

关于携程酒店的爬虫,网上有很多,我仔细看了下,大概的分成了两派:selenuim与python执行JS,夹生饭大佬在知乎的专栏中也讲述的很清楚了,我不想再复刻他的文章了,而且我在github中也找到了开源项目针对携程酒店的,链接点击这里,我在复现夹生饭大佬代码的过程中始终有一段代码没找到 callback = """ var callback = function() { for (var t = ["A", "B", "C&

搜索引擎爬虫技术研究(爬虫框架)-WebCollector

一.简介: https://github.com/CrawlScript/WebCollector/blob/master/README.zh-cn.md 二.使用: <dependency> <groupId>cn.edu.hfut.dmic.webcollector</groupId> <artifactId>WebCollector</artifactId> <version>2.09</version> </

网络爬虫技术

1.爬虫技术概述 网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,以获取或更新这些网站的内容和检索方式.从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件.聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过

总结整理 -- 爬虫技术(C#版)

爬虫技术学习总结 爬虫技术 -- 基础学习(一)HTML规范化(附特殊字符编码表) 爬虫技术 -- 基本学习(二)爬虫基本认知 爬虫技术 -- 基础学习(三)理解URL和URI的联系与区别 爬虫技术 -- 基础学习(四)HtmlParser基本认识 爬虫技术 -- 基础学习(五)解决页面编码识别(附c#代码) 爬虫技术 -- 基础学习(六)解析相对地址 爬虫技术 -- 进阶学习(七)简单爬虫抓取示例(附c#代码) 爬虫技术 -- 进阶学习(八)模拟简单浏览器(附c#代码) 爬虫技术 -- 进阶学

携程智联等网站百分之60%的访问量都是爬虫,对此我们应该怎么办

前言 爬虫和反爬虫日益成为每家公司的标配系统. 爬虫在情报获取.虚假流量.动态定价.恶意攻击.薅羊毛等方面都能起到很关键的作用,所以每家公司都或多或少的需要开发一些爬虫程序,业界在这方面的成熟的方案也非常多. 有矛就有盾,每家公司也相应的需要反爬虫系统来达到数据保护.系统稳定性保障.竞争优势保持的目的. 像安全与黑客从来都是相辅相成一样. 爬虫与反爬虫也是在双方程序员的斗智斗勇的过程不断发展和成长的. 简单的反爬虫: 通过Headers反爬虫 从用户请求的Headers反爬虫是最常见的反爬虫策略

iOS开发——网络使用技术OC篇&amp;网络爬虫-使用正则表达式抓取网络数据

网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看看网络爬虫的基本原理: 一个通用的网络爬虫的框架如图所示: 网络爬虫的基本工作流程如下: 1.首先选取一部分精心挑选的种子URL: 2.将这些URL放入待抓取URL队列: 3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中.

大快搜索数据爬虫技术实例安装教学篇

大快搜索数据爬虫技术实例安装教学篇 爬虫安装前准备工作:大快大数据平台安装完成.zookeeper.redis.elasticsearch.mysql等组件安装启动成功. 1.修改爬虫安装配置文件(最好在线下修改好后再上传平台) 2.修改crawler\dkcrw\jdbc.properties配置文件(只修改图片里的内容其他内容默认即可) Hbase.zookeeper.quorum所填地址应在DKM监控平台查看: Redis相关配置看如下界面: 3.把已修改的crawler\dkcrw\下的

爬虫——Scrapy框架案例二:阳光问政平台

阳光热线问政平台 URL地址:http://wz.sun0769.com/index.php/question/questionType?type=4&page= 爬取字段:帖子的编号.投诉类型.帖子的标题.帖子的URL地址.部门.状态.网友.时间. 1.items.py # -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # http://doc.sc