麻瓜编程·python实战·2-3作业:爬取赶集网二手信息

我的结果

爬取“深圳赶集二手——二手商品——个人——真实个人”,链接28195条,详情28159条

结果.png

我的代码

模块.png

说明:
all_category:从首页获取所有子项链接
deal_each_cate:包含两个重要函数:①提取商品链接;②提取商品详情
counts:计数器

main.py

from multiprocessing import Pool
from deal_each_cate import get_all_urls, get_goods_info
from all_category import ganji_channel
from deal_each_cate import ganji_cate_url
from deal_each_cate import ganji_second_hand

# step1
if __name__ == '__main__':
    # 断点程序
    # ganji_channel这个collection里面包含所有频道1至80页的链接
    all_channel = [page['channel'] for page in ganji_channel.find()]
    # ganji_cate_url里除了包含商品的链接,也包含了这个链接出现页面的链接
    channel_done = [page['channel'] for page in ganji_cate_url.find()]
    # 挑出还没有爬的频道页面
    rest_of_channel = set(all_channel) - set(channel_done)
    print(len(rest_of_channel))
    pool = Pool(processes=4)
    pool.map(get_all_urls, rest_of_channel)

# step2
if __name__ == '__main__':
    # 断点程序
    db_urls = [item['url'] for item in ganji_cate_url.find()]
    info_urls = [item['url'] for item in ganji_second_hand.find()]
    x = set(db_urls)
    y = set(info_urls)
    rest_of_urls = x - y
    print(len(rest_of_urls))
    # print(len(rest_of_urls)) 29693
    # 4个进程
    if rest_of_urls:
        pool = Pool(processes=4)
        pool.map(get_goods_info, rest_of_urls)
    else:
        print('It\'s done')

all_category.py

from bs4 import BeautifulSoup
import requests, time, pymongo

client = pymongo.MongoClient('localhost', 27017)
walden = client['walden']
ganji_channel = walden['ganji_channel']

# cate_list = []
# def get_all_cates():
#     wu_page = 'http://sz.ganji.com/wu/'
#     time.sleep(1)
#     web_data = requests.get(wu_page)
#     soup = BeautifulSoup(web_data.text, 'lxml')
#     for category in soup.select('.fenlei dt a'):
#         category = category.get('href')
#         cate_list.append(category)
#     # print(len(cate_list))
#     # print(cate_list)

cate_list = ['/jiaju/', '/rirongbaihuo/', '/shouji/', '/bangong/', '/nongyongpin/', '/jiadian/',
             '/ershoubijibendiannao/', '/ruanjiantushu/', '/yingyouyunfu/', '/diannao/', '/xianzhilipin/',
             '/fushixiaobaxuemao/',
             '/meironghuazhuang/', '/shuma/', '/laonianyongpin/', '/xuniwupin/', '/qitawupin/', '/ershoufree/',
             '/wupinjiaohuan/']

# for item in cate_list:
#     for i in range(1, 81):
#         channel_page = 'http://sz.ganji.com{}o{}/'.format(item, i)
#         ganji_channel.insert_one({'channel':channel_page})

# print(ganji_channel.find().count())

deal_each_cate.py

# -*- coding:'utf-8' -*-
from bs4 import BeautifulSoup
import requests, time, pymongo, random

client = pymongo.MongoClient('localhost', 27017)
walden = client['walden']
ganji_cate_url = walden['ganji_cate_url']
ganji_second_hand = walden['ganji_second_hand']

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}

# spider1
def get_all_urls(url):
    try:
        web_data = requests.get(url, headers=headers, timeout=7)
        soup = BeautifulSoup(web_data.text, 'lxml')
        # 直到某一页开始没有个人信息就停止
        if soup.find(text='真实个人'):
            # 获取链接
            for info_url in soup.select('.zz-til a'):
                info_url = info_url.get('href').split('&')[0]
                # 处理链接,否则不能顺利爬取商品详情
                useful_url = 'http://zhuanzhuan.58.com/detail/' + info_url.split('=')[-1] + 'z.shtml'
                # 查重, 把ganji_cate_url打开,取出每一条记录的url组成set
                if useful_url not in set(map(lambda x: x['url'], ganji_cate_url.find())):
                    ganji_cate_url.insert_one({'url': useful_url, 'channel': url})
                    print(useful_url)
                else:
                    pass
        else:
            print('nothing')
            # 没有个人信息了
            pass
    except Exception as e:
        print(e)


# spider2
def get_goods_info(url):
    try:
        web_data = requests.get(url, headers=headers, timeout=6)
        soup = BeautifulSoup(web_data.text, 'lxml')
        print(url)
        if soup.find(id='fail'):
            print('fail')
        elif soup.find(text='商品已下架'):
            print('商品已下架')
        else:
            # 提取信息
            title = soup.select('.info_titile')[0].get_text()
            price = soup.select('.price_now i')[0].get_text()
            region = soup.select('.palce_li i')[0].get_text() if soup.find(class_='palce_li') else None
            desc = soup.select('.baby_kuang p')[0].get_text()
            # 写入数据库
            ganji_second_hand.insert_one(
                {'title': title, 'price': price, 'region': region, 'describe': desc, 'url': url})
            print({'title': title, 'price': price, 'region': region, 'describe': desc, 'url': url})
    except Exception as e:
            print(e)

counts.py

# -*- coding:'utf-8' -*-
import time
from deal_each_cate import ganji_cate_url
from deal_each_cate import ganji_second_hand

# step1
while True:
   print(ganji_cate_url.find().count())
   time.sleep(5)

# step2
while True:
    print(ganji_second_hand.find().count())
    time.sleep(5)

我的感想:

  • 完成时间:从昨天到今天早上(实际上我真的不想回忆昨天,好深的坑啊)
  • 昨天应该是网络有问题,老是报错,今早上一次性完成(详情页面大约每秒15个)
  • 断点程度,实际上就是用减法排除那些不再需要爬取的部分,重点在于构建减数和被减数(在不同的数据库中保留相同格式的部分,比如 url,作为类似标记)
  • 计数器挺有意思的,写一个小模块单独运行(开两个cmd)
  • “真实个人”的商品链接点进去其实是“转转”,链接格式如:
    url = 'http://m.zhuanzhuan.58.com/Mzhuanzhuan/zzWebInfo/zzganji/zzpc/detailPc.html?infoId=762113121520779268'
    必须要转成为另外的格式,才能爬到商品详情(关键在 id):
    url = 'http://zhuanzhuan.58.com/detail/762113121520779268z.shtml'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容