专栏首页毛利学Python爬虫篇|爬虫实战(十)

爬虫篇|爬虫实战(十)

前言:

对于爬虫还有一点小知识

fake_useragent的使用

fake_useragent第三方库,来实现随机请求头的设置;

  • 安装 ---> pip3 install fake-useragent
  • 查看useragent ---> http://fake-useragent.herokuapp.com/browsers/
from fake_useragent import UserAgent
ua = UserAgent()
print(ua.ie)   #随机打印ie浏览器任意版本
print(ua.firefox) #随机打印firefox浏览器任意版本
print(ua.chrome)  #随机打印chrome浏览器任意版本
print(ua.random)  #随机打印任意厂家的浏览器

Queue模块

主要有以下成员函数:

  • Queue.empty():判断消息队列是否为空,返回True或False。同样不可靠。
  • Queue.not_empty():判断消息队列是否为非空。同上不可靠。
  • Queue.full():类似上边,判断消息队列是否满。
  • Queue.put(item, block=True, timeout=None):往消息队列中存放消息。block可以控制是否阻塞,timeout指定阻塞时候的等待时间。如果不阻塞或者超时,会引起一个full exception。
  • Queue.get(block=True, timeout=None):获取一个消息,其他同put。

爬虫练习

目标:爬取毛豆新车的数据,开线程使用队列大量的爬取

https://www.maodou.com/car/list/all/ (链接)

要点进去继续爬取,这是爬虫最常见的方式,也是必须会的爬虫,对于这种方法,一般用框架使用的多

就是把车的全部信息扒下来

导入对应的模块

import threading
from threading import Thread
from queue import Queue
import requests
from lxml import etree
from fake_useragent import UserAgent

将每辆车的url用列表储存起来

def page_url(base_url):
    headers = {
        'User-Agent': ua.random,
    }
    page = '1'
    url_list = []
    while True:
        url = base_url % page
        print(url)
        # 解码
        html = requests.get(url, headers=headers).content.decode('utf-8')
        # 遍历
        page = str(int(page) + 1)
        tree = etree.HTML(html)
        a_list = tree.xpath('//div[@class="list-wrap clearfix"]/a/@href')
        for a in a_list:
            url_list.append(a)
        if len(a_list) == 0:
            break
    return url_list

用队列将每页的url储存起来

get_queue = Queue()
class Crawl_MD(Thread):
    def __init__(self, url_queue):
        # 类的写法
        super(Crawl_MD, self).__init__()
        self.url_queue = url_queue
    def run(self):
        while True:
            if self.url_queue.empty():
                break
            try:
                url = self.url_queue.get(block=False)
                self.get_request(url)
            except Exception as e:
                print(e)
    def get_request(self, url):
        headers = {
            'User-Agent': ua.random,
        }
        response = requests.get(url, headers=headers).content.decode('utf-8')
        get_queue.put(response)

最后在详细页把需要的信息一个一个匹对下来

num = 1
class Customer_MD(Thread):
    def run(self):
        while True:
            if get_queue.empty() and flag:
                break
            try:
                response = get_queue.get(block=False)
                self.get_data(response)
            except Exception as e:
                print(e)
    def get_none(self, word):
        if len(word) > 0:
            return word[0]
        else:
            return ''
    def get_data(self, response):
        tree = etree.HTML(response)
        title = tree.xpath('//h2[@class="banner-tit"]/text()')
        img = tree.xpath('//div[@class="slider"]//li[1]/img/@src')
        soufu = tree.xpath('//div[@class="sy-yf"]//p[@class="sy-num"]/text()')
        yuegong = tree.xpath('//div[@class="sy-yf"]/div[2]/p[@class="yf-num sy-num"]/text()')
        firm_money = tree.xpath('//p[@class="price "]/text()')
        peizhi = tree.xpath('//ul[@class="config-detail"]//p/text()')
        PZ = {}
        for i, j in zip(peizhi[::2], peizhi[1::2]):
            PZ[i] = j
        # print(title, img, soufu, yuegong, firm_money, peizhi)
        data = {
            'title': self.get_none(title),
            'img': self.get_none(img),
            '首付': ''.join(soufu).replace('   ', '|'),
            '月供': ''.join(yuegong).replace('  ', '|'),
            'firm_money': self.get_none(firm_money),
            '配置': PZ
        }
        print(data)
        global num
        word = [{"num": num}, {'data': data}]
        if lock.acquire():
            with open('data.txt', 'a') as f:
                f.write(str(word) + '\n')
                num += 1
                lock.release()

开爬

if __name__ == '__main__':
    # 创建队列用于储存翻页url
    get_queue = Queue()
    ua = UserAgent()
    # 用来做标识
    flag = False
    # 每辆车详细页的url
    list = page_url('https://www.maodou.com/car/list/all/pg%s')
    # 创建队列用于爬取数据
    url_queue = Queue()
    # 翻页的url列表
    crawl_list = []
    # 每辆车的url
    customer_list = []
    # 锁起来
    lock = threading.Lock()
    # 详细页的url的队列
    [url_queue.put(i) for i in list]
    # 开三个线程来爬翻页的url
    for cre in range(3):
        crawl = Crawl_MD(url_queue)
        crawl.start()
        crawl_list.append(crawl)
    # 开三个线程来爬数据
    for cus in range(3):
        customer = Customer_MD()
        customer.start()
        customer_list.append(customer)
    # 释放锁
    [i.join() for i in crawl_list]
    # 如果分页的队列可能为空
    flag = True
    # 释放锁
    [a.join() for a in customer_list]

爬取结果

总结:

对于此类爬虫,一般使用的都是scrapy和pyspider框架,但我觉得能不能使用框架最好不使用框架

本文分享自微信公众号 - 毛利学Python(sen13717378202),作者:小sen

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 实操 | 从0到1教你用Python来爬取整站天气网

    Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。

    用户6029108
  • 爬虫篇| 爬取豆瓣电影(二)

    上次爬取了百度图片,是分析解决ajax的json的响应的,对于一些网站的常见的数据的爬取,是这次主要内容。

    用户6029108
  • 爬虫篇| 爬虫中的urllib库使用(三)

    我们首先了解一下 Urllib 库,它是 Python 内置的 HTTP 请求库,也就是说我们不需要额外安装即可使用,它包含四个模块:

    用户6029108
  • 测试mktime和localtime_r性能及优化方法

    一见
  • 测试mktime和localtime_r性能及优化方法

    一见
  • 在Jenkins中使用sonar进行静态代码检查

    懒得说,跟着官方文档走就行,这边主要的开发语言是.net core 和 typescript,所以在sonar server中的应用市场搜索对应语言安装就完事 ...

    旺财的城堡
  • AngularDart Material Design 工具提示 顶

    工具提示卡的目标可以是任何元素,例如按钮,输入,链接等。目标也可以是help_outline图标,其充当实际目标的代理。

    南郭先生
  • .net Framework 源代码 · ScrollViewer 使用原理其他源代码分析

    本文是分析 .net Framework 源代码的系列,主要告诉大家微软做 ScrollViewer 的思路,分析很简单。 看完本文,可以学会如何写一个 Scr...

    林德熙
  • 数据结构之链表与递归

    1、提起链表,有一块非常重要的内容,就是递归,这是因为链表本身具有天然的递归性,同时,链表也是一种结构非常简单的数据结构,使得链表是一种非常好的来学习和研究递归...

    别先生
  • Go 谚语

    本文译自go-proverbs, 脱胎于 Rob Pike 振奋人心的演讲视频 talk at Gopherfest SV 2015 (bilibili). 不...

    李海彬

扫码关注云+社区

领取腾讯云代金券