《零基础:21天搞定Python分布爬虫》练习-百思不得姐-精华抓取

 python   高蒙   阅读(1437)   评论(0)   2019-04-01 16:23:22     


import threading
import requests
from queue import Queue
from lxml import etree
import re
import csv
import time

csv_header_num = 0


# 生产者
class Producter(threading.Thread):
    def __init__(self, page_queue, info_queue, *args, **kwargs):
        super(Producter, self).__init__(*args, **kwargs)
        self.page_queue = page_queue
        self.info_queue = info_queue
        self.headers = {
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
            "cookie": "__cfduid=d2a61de29a61781abd96707aa8981826c1554019090; UM_distinctid=169d2c18026211-001319c41bb32e-3c604504-1fa400-169d2c180275e4; _ga=GA1.2.679455519.1554019091; _gid=GA1.2.1187621390.1554019091; yjs_id=ca79619b6d61f50846a806c1e6d8172b; ctrl_time=1; CNZZDATA1256911977=696277388-1554018365-%7C1554019265; XSRF-TOKEN=eyJpdiI6IlZmQXFuVXJ5Q3VTZDZOb3I2ZnhTemc9PSIsInZhbHVlIjoieXVJekZkc1IwMExxZnlLalY1Tk1IYit5M2NKaGtkeXNDaHRqYTJSVFlwRG1GK2ttekMzam9tMDZVWkt2WWRFXC8iLCJtYWMiOiI2NTA1OGRkMmNiNDFmZDEzMTgxZmU3NzQ2NzRlZGYzNThiZjkyYzMxZjkxZjM5YTNkMTI2MjQ1NTlhY2ViMmMyIn0%3D; doutula_session=eyJpdiI6InFiazlaZU4xdDZ6K2N4cW5talNid2c9PSIsInZhbHVlIjoiVTdSOFF6SExVN25mdTNCWWF3bzdXSFFHNTJOQnh3YUpnQm9RRDRESmQ0ZzdEa2VZejcrc0s3dEtFXC9EZFJRa0oiLCJtYWMiOiJjOWU1ZTBmNjU5MmJhZTVmNDRjODU0YmIzYmJjMDI1YTAxNmRhNTExZTkwOTQ5YjkwMGEyYmRmOGY0NzNhNjFiIn0%3D",
        }

    def run(self):
        while True:
            if self.page_queue.empty():
                print('分页地址结束~')
                break
            url = self.page_queue.get()
            self.parse_url(url)

    def parse_url(self, url):
        res = requests.get(url, headers=self.headers)
        text = res.content.decode('utf-8')
        html = etree.HTML(text)
        nicknames = html.xpath('//div[@class="j-r-list"]//ul//li//a[@class="u-user-name"]/text()')
        addtimes = html.xpath('//div[@class="j-r-list"]//ul//li//span[@class="u-time  f-ib f-fr"]/text()')

        # 多行文本拼接 a标签下 有P标签
        contents = html.xpath('//div[@class="j-r-list"]//ul//li//div[@class="j-r-list-c-desc"]')
        for i, v in enumerate(contents):
            contents[i] = '<br/>'.join(v.xpath('.//text()')).strip()

        likeups = html.xpath('//div[@class="j-r-list"]//ul//li//li[@class="j-r-list-tool-l-up"]/span/text()')
        likedowns = html.xpath('//div[@class="j-r-list"]//ul//li//li[@class="j-r-list-tool-l-down "]/span/text()')
        shares = html.xpath('//div[@class="j-r-list"]//ul//li//div[@class="j-r-list-tool-ct-share-c"]/span/text()')

        # 处理分享数字的获取  想用 map lambda 没用起来
        for i, v in enumerate(shares):
            shares[i] = re.sub(r'\D', '', v)
        for val in zip(nicknames, addtimes, contents, likeups, likedowns, shares):
            nickname, addtime, content, likeup, likedown, share = val
            data = {
                "nickname": nickname,
                "addtime": addtime,
                "content": content,
                "likeup": likeup,
                "likedown": likedown,
                "share": share,
            }
            self.info_queue.put(data)
        # print('数据剩余 - %d' % self.info_queue.qsize())


# 消费者
class Consumer(threading.Thread):
    def __init__(self, page_queue, info_queue, *args, **kwargs):
        super(Consumer, self).__init__(*args, **kwargs)
        self.page_queue = page_queue
        self.info_queue = info_queue
        self.headers = ["nickname", "addtime", "content", "likeup", "likedown", "share"]

    def run(self):
        while True:
            global csv_header_num
            if self.page_queue.empty() and self.info_queue.empty():
                print('下载完成~')
            values = self.info_queue.get()
            value = [(values['nickname'], values['addtime'], values['content'], values['likeup'], values['likedown'],
                      values['share'])]
            with open('百思不得姐.csv', 'a', encoding='utf-8', newline='') as fp:
                writer = csv.writer(fp)
                if csv_header_num == 0:
                    writer.writerow(self.headers)  # 写入表头数据
                writer.writerows(value)  # 写入实体数据
                csv_header_num += 1
            print(csv_header_num)


def main():
    page_queue = Queue(20)
    info_queue = Queue(20 * 20)

    for i in range(1, 6):
        url = 'http://www.budejie.com/text/%d' % i
        page_queue.put(url)
        print(url)

    # 开启生产者线程
    for i in range(3):
        t = Producter(page_queue, info_queue)
        t.start()

    time.sleep(1)

    # 开始消费者线程
    for i in range(2):
        t = Consumer(page_queue, info_queue, )
        t.start()


if __name__ == '__main__':
    main()





相关文章



我要评论


站长昵称:(*)

输入内容:


评论列表


高蒙

男,程序猿一枚

 

人生要是没有理想, 那跟一条咸鱼有什么分别。


关于我

  http://www.shuchengxian.com

高蒙个人博客是以PHP技术为主的程序员个人博客。博客主要发布php开发中遇到的问题以及解决办法,同时个人博客也分享网站模板素材,jquery插件等方面素材。


站点声明:相关侵权、举报、投诉及建议等,请发E-mail:936594075#qq.com(#替换成@)。

Copyright © 2018, www.shuchengxian.com, All rights reserved. 个人博客皖公网安备 34152302000022号 皖ICP备15015490号

关键词:个人博客,PHP博客,PHP博客程序,高蒙博客,高蒙个人博客,php程序员博客,程序员个人博客