python爬取赶集网

爬取赶集网二手交易市场所有类目,并将信息储存在数据中。

效果是这样的:

所有类目访问链接
产品详情信息

我的代码:

#建立channel_list.py文件获取所有类目的访问链接
import requests
from bs4 import BeautifulSoup
start_url='http://bj.ganji.com/wu/'
def get_channel_list(url):
    web_data=requests.get(url)
    soup=BeautifulSoup(web_data.text,'lxml')
    channels=soup.select('dl.fenlei dt a')
    # print(channels)#返回的是列表
    for channel in channels:
        base_url = 'http://bj.ganji.com'
        residue_url=channel.get('href')
        full_url=base_url+residue_url
        print(full_url)
get_channel_list(start_url)

channel_list='''
http://bj.ganji.com/jiaju/
http://bj.ganji.com/rirongbaihuo/
http://bj.ganji.com/shouji/
http://bj.ganji.com/shoujihaoma/
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/
'''
#建立link_list_detail_info.py文件获取每个类目的所有链接存放入数据库'linklists'及将每个类目的具体产品信息存放在'detailinfo'
import requests
from bs4 import BeautifulSoup
import time
from pymongo import MongoClient
import random
client=MongoClient('localhost',27017)
ganjiDB=client['ganjiDB']
linklists=ganjiDB['linklists']
detailinfo=ganjiDB['detailinfo']
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'}
proxy_list=[    
    'http://125.88.74.122:83',
    'http://113.18.193.5:8080',
    'http://113.18.193.7:8080',
    'http://120.92.3.127:90'
    ]
proxy_ip=random.choice(proxy_list)
proxies={'http':proxy_ip}#启用代理,规避赶集网针对单个IP的访问限制

def page_link(channel):
    for cate in range(1,3):
        for page in range(1,101):
            link_url = ['{}a{}o{}'.format(channel, cate, page)][0]
            #print(link_url)
            link_list(link_url)

def link_list(url):
    time.sleep(2)
    web_data=requests.get(url,headers=headers)
    # print(web_data.status_code)#返回结果code 200
    soup=BeautifulSoup(web_data.text,'lxml')
    # mark=soup.find('a','next')#返回结果为字符串<a class="next"href="/jiaju/a1o31/"><span>下一页</span></a>
    # print(mark)
    if soup.find('a','next')and url.split('/')[-1][1]=='1':#满足两个条件1、当前页不是最后一页2、当前页属于个人类目
        lists=soup.select('td.t a.t')#与商家类目过滤条件不同
        # print(lists)
        for list in lists:
            list_href=list.get('href').split('?')[0]
            linklists.insert_one({'list_href':list_href})
            print(list_href)
    elif soup.find('a', 'next') and url.split('/')[-1][1] == '2':#满足两个条件1、当前页不是最后一页2、当前页属于商家类目
        lists = soup.select('a.ft-tit')#与个人列木过滤条件不同
        # print(lists)
        for list in lists:
            list_href = list.get('href')
            linklists.insert_one({'list_href': list_href})
            print(list_href)
    else:
        print('列表地址错误')
#获取每个页面的具体信息
def get_detail_info(url):
    web_data=requests.get(url,headers=headers)
    soup=BeautifulSoup(web_data.text,'lxml')
    if url[-5]=='x':
        info={
        'title':soup.select('h1.title-name')[0].text,
        'date':soup.select('i.pr-5')[0].text.strip(),
        'types':soup.select('ul > li > span > a')[5].text,
        'price':soup.select('i.f22.fc-orange.f-type')[0].text,
        'area':list(map(lambda x:x.text,soup.select('div > div > div > div > ul > li > a')[-3:-1])),
        'url':url
        }
        detailinfo.insert_one(info)
        print(info)
    elif url[-7]=='z':
        info={
        'title':soup.select('h1.info_titile')[0].text,
        'price':soup.select('span.price_now i')[0].text,
        'area':soup.select('div.palce_li span i')[0].text,
        'url':url
        }
        detailinfo.insert_one(info)
        print(info)
    else:
        print('地址错误')
#建立main.py文件调用channel_list.py、link_list_detail_info.py中的属性和方法及数据库信息
from channel_list import channel_list
from link_list_detail_info import linklists,page_link,link_list
from link_list_detail_info import detailinfo,get_detail_info
from multiprocessing import Pool
import time
def get_all_links(channel):
    page_link(channel)
db_urls=set([item['list_href'] for item in linklists.find()])
index_urls=set([item['url'] for item in detailinfo.find()])
rest_of_url=db_urls-index_urls#断点续传
if __name__=='__main__':
    pool=Pool()
    pool.map(get_all_links,channel_list.split())#调用channel_list
    time.sleep(10)
    pool.map(get_detail_info,rest_of_url)#调用rest_of_url中每个类目下具体页面链接获取页面详情并进行断点续传优化
#建立count.py文件实时监控存入linklists中链接数量
from link_list_detail_info import linklists
import time
while True:
    print(linklists.find().count())
    time.sleep(10)
监控截图:
监控效果图

总结:

  • Mongodb数据的基础功能使用;
  • 多进程访问方式的引用;
  • 数据库查找的灵活调用实现断点续传;
  • map、lambda函数的使用;
  • proxy及headers防爬机制的使用。
Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 掌握了BeatifulSoup的基本用法之后,爬取单个网页实际上是比较简单的:只需要使用requests库中的ge...
    废柴社阅读 1,978评论 1 7
  • 第一次上kaggle来做实训,第一印象界面美观,向导友好,难怪有那么多人来推荐。数据集也很丰富,有关于欧洲足球的,...
    tcc26阅读 1,311评论 1 7
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,424评论 25 707
  • 今天是元宵节,小编在这里祝大家元宵节快乐! 为了写这篇文章,我昨晚后半夜才睡,一直在听喜马拉雅上李尚龙的《小王子》...
    斜杠小白阅读 487评论 0 0