Day26.爬虫案例一:拍拍网

爬虫案例一:拍拍网



前言

本文主要是通过学习的知识,写了一个简单的小爬虫,获取了拍拍网的产品信息,并存贮在mongodb中。


一. 拍拍网案例

这里主要是爬取了拍拍网(京东旗下的一个二手市场)的部分商品(商品的内容可以自己指定)。然后用多线程爬取你输入的商品,并将这些内容导入到mongodb中。

1.1 首先将需要的包导入

import pymongo
import requests
from bs4 import BeautifulSoup
import time
from multiprocessing import Pool

1.2 创建一个爬取拍拍网的类

class paipai_spider():
    #  创建数据库以及相应的表格
    client = pymongo.MongoClient('localhost', 27017)
    paipai = client['paipai']
    ershoushouji = paipai['ershoushouji']

    def get_soup(self, url):
        headers = {
            "User-Agent": "*****",
            "Cookie": "*****",
            "Referer": "******"
        }

        response = requests.get(url, headers=headers)
        soup = BeautifulSoup(response.text, "lxml")
        return soup

    #  通过调用get_soup函数,获得我们需要的数据
    def get_data(self, url):
        soup = self.get_soup(url)

        # 这是获取的一页的数据
        urls = [i.get("href") for i in soup.select("#J_goodsList > ul > li > div > div.p-img > a")]  # 链接
        titles = [i.get("title") for i in soup.select("#J_goodsList > ul > li > div > div.p-img > a")]  # 标题
        images = [i.get("data-lazy-img") for i in
                  soup.select("#J_goodsList > ul > li > div > div.p-img > a > img")]  # 图片
        prices = [i.text for i in soup.select("#J_goodsList > ul > li > div > div.p-price > strong > i")]  # 价格
        infos = [i.text.split("\n")[-1] for i in
                 soup.select("#J_goodsList > ul > li > div > div.p-name.p-name-type-2 > a > em")]  # 信息
        comments = [i.get("href") for i in
                    soup.select("#J_goodsList > ul > li > div > div.p-commit > strong > a")]  # 评论
        shop_names = [i.get("title") for i in soup.select("#J_goodsList > ul > li > div > div.p-shop > span > a")]  # 店名
        discounts = [[i.text for i in i.select("i")] for i in
                     soup.select("#J_goodsList > ul > li > div > div.p-icons")]  # 优惠

        time.sleep(2)  # 以防爬取的太密集被反爬虫,这里休息两秒。

        # 将这些数据存贮成字典形式
        for url, title, image, price, info, comment, shop_name, discount in zip(urls, titles, images, prices, infos,
                                                                                comments, shop_names, discounts):
            data = {
                "urls": url,
                "titles": title,
                "images": image,
                "prices": price,
                "infos": info,
                "comments": comment,
                "shop_names": shop_name,
                "discounts": discount
            }
            self.ershoushouji.insert_one(data)
        print("Insert OK!")  # 爬完一页之后,显示一下。

    """
        主要是我们得进入该链接,然后看这个网页最大是多少页,然后将page进行设定,就可以获取所有该种二手产品的网页,
        当然了,首先第一步是输入该种产品的链接,最后返回该种产品的所有链接的一个列表。
        但是,好像网页不显示这个页码,也就是找不出来,很奇怪。。
        而且,本来只有100页的内容,也就是page=199就结束了,但是我发现,page=201同样也有内容。。
        所以,我就降低要求吧,比如每种二手产品,我们只爬取100页就好。

    """

    # 如何获取某一种产品的所有链接
    def get_type_urls(self, url):
        # 这里可以设定爬取多少页的内容
        return [url + "&page={}".format(i) for i in range(1, 201)]

    # 获得你想要的产品的链接
    def get_all_types(self, name):
        """
        param:
        	name:输入想要看的产品名称 ,输入类型为 字符串
        return:输出所有该类产品的所有链接,输出类型为字符串
        """

        return "https://search.jd.com/Search?keyword={}".format(name)

1.3 实现爬虫类并做测试。

if __name__ == "__main__":
    pool = Pool()  # 使用多线程

    paipai = paipai_spider()
    # product = ["二手手机", "电脑", "家电", "图书", "乐器", "奢侈品"]
    name = paipai.get_all_types("二手手机")  # 首先,先输入你想爬取的内容的种类

    urls = paipai.get_type_urls(name)  # 通过“name”,获取了关于“name”的所有链接

    # 在“urls”链接中,我逐个输入,就可以得到每条数据
    pool.map(paipai.get_data, (url for url in urls))

    print("Spider finish!")

总结

代码刚出炉的,在短时间内使用应该是没问题的。也算是对前面学习的爬虫知识的一个检验,其实也有很多需要修改和优化的地方,也恳请大家集思广益,谢谢大家。

溜了遛了,脑壳疼。Loading(26/100)。。。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值