爬取赶集网二手物品下所有物品的信息

四周爬虫课第二周的练习,爬取赶集网二手物品下所有物品的信息。大致思路:1、爬取频道页url;2、爬取商品详情页url,写入mongodb,url_list表;3、从url_list表读取url,爬取商品信息,写入mongodb,p_info表

分成3个py文件:1、channel_url.py,获取频道页url;2、page_parse.py,主要是2个爬虫函数,分别完成2个数据表的写入;3、main.py,主程序文件,也就是本文件,开启多进程,完成整个工作

最后顺利完成任务,感觉现在赶集真不行了,没多少数据。
channel_url.py文件:
import requests
from bs4 import BeautifulSoup

start_url = ‘http://bj.ganji.com/wu/‘
url_host = ‘http://bj.ganji.com‘

def get_channel_url(url):
    channel_urls = []
    raw_data = requests.get(url).text
    soup = BeautifulSoup(raw_data,‘lxml‘)
    eles = soup.select(‘div.content dt>a‘)
    for e in eles:
        channel_url = url_host + e.get(‘href‘)
        print(channel_url)
        channel_urls.append(channel_url)
    return channel_urls

# channel_urls = get_channel_url(start_url)
# print(‘len(channel_urls):‘,len(channel_urls))

# 这是程序运行的结果,直接保存下来了,就不用再运行get_channel_url()了
channel_urls = ‘‘‘
    http://bj.ganji.com/jiaju/
    http://bj.ganji.com/rirongbaihuo/
    http://bj.ganji.com/shouji/
    http://bj.ganji.com/bangong/
    http://bj.ganji.com/nongyongpin/
    http://bj.ganji.com/jiadian/
    http://bj.ganji.com/ershoubijibendiannao/
    http://bj.ganji.com/ruanjiantushu/
    http://bj.ganji.com/yingyouyunfu/
    http://bj.ganji.com/diannao/
    http://bj.ganji.com/xianzhilipin/
    http://bj.ganji.com/fushixiaobaxuemao/
    http://bj.ganji.com/meironghuazhuang/
    http://bj.ganji.com/shuma/
    http://bj.ganji.com/laonianyongpin/
    http://bj.ganji.com/xuniwupin/
    http://bj.ganji.com/qitawupin/
    http://bj.ganji.com/ershoufree/
    http://bj.ganji.com/wupinjiaohuan/
‘‘‘

  

page_parse.py文件:
import requests
from bs4 import BeautifulSoup
from time import sleep
from pymongo import MongoClient

client = MongoClient(‘localhost‘,27017)
ganji = client[‘ganji‘]
url_list = ganji[‘url_list‘]
p_info = ganji[‘p_info‘]

# 给定频道url,爬取此频道下所有商品的url,打印并写入mongo数据库
def get_product_url(url):
    channel_url = url
    page_num = 1
    while True:
        raw_page = requests.get(url).text
        print(‘正在get网页:‘,url)
        sleep(2)
        soup = BeautifulSoup(raw_page,‘lxml‘)
        eles = soup.select(‘a.ft-tit‘)
        print(‘len(eles):‘,len(eles))
        for e in eles:
            p_url = e.get(‘href‘)
            url_list.insert_one({‘p_url‘:p_url})
            print(p_url)
        if soup.select(‘a.next‘):
            page_num += 1
            url = channel_url + ‘o‘ + str(page_num) + ‘/‘
        else:
            break

# 给定商品详情页url,爬取商品具体信息,打印并写入mongo数据库
def get_product_info(url):
    raw_page = requests.get(url).text
    sleep(2)
    soup = BeautifulSoup(raw_page,‘lxml‘)

    if soup.select("p:contains(‘信息刚被删除~‘)"):   # 判断商品信息是否已经删除
        print(‘信息刚被删除~‘)
        pass
    else:
        title = soup.select(‘h1.title-name‘)[0].get_text() if soup.select(‘h1.title-name‘) else None
        category = list(soup.select(‘div.crumbs.routes.clearfix‘)[0].stripped_strings) if soup.select(‘div.crumbs.routes.clearfix‘) else None
        date = soup.select(‘i.pr-5‘)[0].get_text().split(‘\\‘)[0].strip() if soup.select(‘i.pr-5‘) else None
        price = soup.select(‘i.f22.fc-orange.f-type‘)[0].get_text() if soup.select(‘i.f22.fc-orange.f-type‘) else None
        address = soup.select(‘ul.det-infor>li:nth-child(2)>a‘)[0].get_text() if soup.select(‘ul.det-infor>li:nth-child(2)>a‘) else None
        p_dict = {‘title‘:title,‘category‘:category,‘date‘:date,‘price‘:price,‘address‘:address,‘url‘:url}
        p_info.insert_one(p_dict)
        print(p_dict)

  

main.py文件:
from channel_url import channel_urls     # 从channel_url.py导入某变量,会把channel_url.py都执行一遍,但变量只在模块内部保留
from page_parse import get_product_url, get_product_info, url_list   # 需要导入url_list
from multiprocessing import Pool
from datetime import datetime

# 从mongodb中读取商品url,返回所有商品的url
def read_all_p_urls():
    all_p_urls = []
    for item in url_list.find():
        all_p_urls.append(item[‘p_url‘])
    return all_p_urls

if __name__ == ‘__main__‘:
    start_time = datetime.now()

    # 不用多进程的方式,耗时会多好几倍
    # for channel in channel_urls.split():
    #     get_product_url(channel)

    pool = Pool()
    #用多进程的方式,4进程和自动分配进程耗时差不多
    #pool = Pool(processes=4)

    # 根据channel url,获取商品url,写入mongodb
    pool.map(get_product_url,channel_urls.split())

    # 根据商品url,获取商品信息,写入mongodb;这一句可以跟上面那句分开执行
    pool.map(get_product_info,read_all_p_urls())

    end_time = datetime.now()
    during = end_time - start_time
    print(‘总共耗时:‘,during)

  

原文地址:https://www.cnblogs.com/djlbolgs/p/12539821.html

时间: 2024-07-30 07:18:56

爬取赶集网二手物品下所有物品的信息的相关文章

爬取赶集网的租房信息

碰到的问题: 1.list 越界 查询后加了个 try: except IndexError: pass 一个简单的爬虫程序 1 import requests 2 from lxml import etree 3 import csv 4 import os 5 6 7 #创建一个csv文件 如果文件步存在则自动创建 8 f = open("house3.csv", "w+") 9 10 #构造一个csv对象 11 csv_file = csv.writer(f)

使用python爬取东方财富网机构调研数据

最近有一个需求,需要爬取东方财富网的机构调研数据.数据所在的网页地址为: 机构调研 网页如下所示: 可见数据共有8464页,此处不能直接使用scrapy爬虫进行爬取,因为点击下一页时,浏览器只是发起了javascript网络访问,然后将服务器返回的数据插入网页,无法通过网址直接获取对应页的的页面数据. 通过chrome的开发者工具,我们可以看到点击下一页按钮背后发起的网页访问: 在点击下一页时,浏览器向地址发起了访问.我们分析一下这个地址的结构: http://data.eastmoney.co

[PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索(二)

前情提要:最近使用PHP实现了简单的网盘搜索程序,并且关联了微信公众平台,名字是网盘小说.用户可以通过公众号输入关键字,公众号会返回相应的网盘下载地址.就是这么一个简单的功能,类似很多的网盘搜索类网站,我这个采集和搜索程序都是PHP实现的,全文和分词搜索部分使用到了开源软件xunsearch. 上一篇([PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索)中我重点介绍了怎样去获取一大批的百度网盘用户,这一篇介绍怎样获得指定网盘用户的分享列表.同样的原理,也是找到百度获取分享列表的接口,

Scrapy爬虫(5)爬取当当网图书畅销榜

??本次将会使用Scrapy来爬取当当网的图书畅销榜,其网页截图如下: ??我们的爬虫将会把每本书的排名,书名,作者,出版社,价格以及评论数爬取出来,并保存为csv格式的文件.项目的具体创建就不再多讲,可以参考上一篇博客,我们只需要修改items.py文件,以及新建一个爬虫文件BookSpider.py. ??items.py文件的代码如下,用来储存每本书的排名,书名,作者,出版社,价格以及评论数. import scrapy class BookspiderItem(scrapy.Item):

Python爬虫项目--爬取自如网房源信息

本次爬取自如网房源信息所用到的知识点: 1. requests get请求 2. lxml解析html 3. Xpath 4. MongoDB存储 正文 1.分析目标站点 1. url: http://hz.ziroom.com/z/nl/z3.html?p=2 的p参数控制分页 2. get请求 2.获取单页源码 1 # -*- coding: utf-8 -*- 2 import requests 3 import time 4 from requests.exceptions import

Node.js爬虫-爬取慕课网课程信息

第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让我们方便的操作HTML,就像是用jQ一样 开始前,记得 npm install cheerio 为了能够并发的进行爬取,用到了Promise对象 //接受一个url爬取整个网页,返回一个Promise对象 function getPageAsync(url){ return new Promise(

Python爬取天气网历史天气数据

我的第一篇博客,哈哈哈,记录一下我的Python进阶之路! 今天写了一个简单的爬虫. 使用python的requests 和BeautifulSoup模块,Python 2.7.12可在命令行中直接使用pip进行模块安装.爬虫的核心是利用BeautifulSoup的select语句获取需要的信息. pip install requests pip install bs4 以武汉市2017年5~7月的历史为例爬取天气网中武汉市的历史天气数据. 7月对应的网址为http://lishi.tianqi

基于爬取百合网的数据,用matplotlib生成图表

爬取百合网的数据链接:http://www.cnblogs.com/YuWeiXiF/p/8439552.html 总共爬了22779条数据.第一次接触matplotlib库,以下代码参考了matplotlib官方文档:https://matplotlib.org/users/index.html. 数据查询用到了两个方法:getSexNumber(@sex varchar(2),@income varchar(30)).gethousingNumber(@sex varchar(2),@hou

爬取豆瓣网评论最多的书籍

相信很多人都有书荒的时候,想要找到一本合适的书籍确实不容易,所以这次利用刚学习到的知识爬取豆瓣网的各类书籍,传送门https://book.douban.com/tag/?view=cloud. 首先是这个程序的结构,html_downloader是html下载器,html_outputer是导出到Excel表,html_parser是解析页面,make_wordcloud是制作词云,spided_main是程序入口,url_manager是URL管理器 主要实现思路是先请求下载需要的html,