新手学习爬虫实战案例

对于新手小白初入爬虫行业来说,如何系统的学习并借鉴同行爬虫经验显得尤为重要,学习爬虫不仅仅靠的是书本的理论知识,更多的是需要进行实战演练,光有理论无实战基础是没法提升自身爬虫能力的。下文就是有关爬虫实战案例,希望对大家有所帮助。

小知识:

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]

爬取结果
新手学习爬虫实战案例_第1张图片

总结:

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

你可能感兴趣的:(爬虫,学习,python)