第二周周作业

详情页信息
详情页链接信息
详情页数据库信息
#抓取频道链接
from bs4 import BeautifulSoup
import requests
start_url = 'http://bj.ganji.com/wu/'


def get_channel_links(url):
    web_data = requests.get(url)
    soup = BeautifulSoup(web_data.text, 'lxml')
    links = soup.select('div.content dt a')
    for link in links:
        channel_links = 'http://bj.ganji.com' + link.get('href')
        print(channel_links)

get_channel_links(start_url)
All_channnel_links = '''
    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/
#爬取详情页信息
from bs4 import BeautifulSoup
import requests
import random
import time
import pymongo
client =pymongo.MongoClient('localhost', 27017)
ganjidb = client['ganjidb']
detail_urls = ganjidb['detail_urls']
detail_info = ganjidb['detail_info']
# http://cn-proxy.com/,获得免费iP的网站
proxy_list = [
    'http://101.96.11.45 :8090',
    'http://115.28.31.219:8888',
    'http://27.115.75.114:8080',
]
# 随机获取代理ip
proxy_ip = random.choice(proxy_list)
proxies = {'http': proxy_ip}
#随机UA
userAgent = random.choice(['Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36',
                           'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.86 Safari/537.36',
                           'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36',
                           'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36',
                           'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1',
                           'Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'])


#爬取详情页的链接
def getdetail_links(channel_links, pages, who_sales='o'):
    headers = {
        'User-Agent': userAgent,
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, sdch',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive'
    }
    info_links = '{}{}{}/'.format(channel_links, who_sales, str(pages))
    web_data = requests.get(info_links, headers=headers)
    i = random.randrange(1, 3)
    time.sleep(i)
    web_data.encoding = 'utf-8'
    if web_data.status_code == 200:
        try:
            soup =BeautifulSoup(web_data.text, 'lxml')
            links = soup.select('dd.feature > div >  ul > li')
            for link in links:
                detail_url = channel_links + str(link.get('data-puid')) + 'x.htm'
                detail_urls.insert_one({'url': detail_url})
                get_detailinfo(detail_url)
        except UnicodeEncodeError:
            pass
    else:
        pass



#爬取详情页上的信息
def get_detailinfo(detailpg_url):
    headers = {
        'User-Agent': userAgent,
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, sdch',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive'
    }
    web_data = requests.get(detailpg_url, headers=headers)
    i = random.randrange(1, 3)
    time.sleep(i)
    web_data.encoding = 'utf-8'
    if web_data.status_code == 200:
        try:
            soup = BeautifulSoup(web_data.text, 'lxml')
            title = soup.select('h1.title-name')[0].text
            price = soup.select('.f22.fc-orange.f-type')[0].text
            # 注意split()函数里的冒号是中文字符下的
            degree= soup.select('ul.second-det-infor.clearfix > li ')[0].text.split(':')[-1].strip() if soup.find('ul', 'second-det-infor') and soup.select('ul.second-det-infor.clearfix > li')[0].text.split(':')[0].strip() == '新旧程度' else None
            cate = soup.select('ul.det-infor > li:nth-of-type(1) > span')[0].text
            area = []
            areas = soup.select('div.content.clearfix > div.leftBox > div:nth-of-type(3) > div > ul > li:nth-of-type(3) > a')
            for i in areas:
                if i.text != '-':
                    area.append(i.text)
                else:
                    return
            date = soup.select('i.pr-5')[0].text.strip().split(' ' and '\xa0发布')[0] if soup.find('i', 'pr-5') else None
            data = {
                '标题': title,
                '价格': price,
                '日期': date,
                '新旧程度': degree,
                '分类': cate,
                '地区': area,
                'url': detailpg_url
            }
            detail_info.insert_one(data)
            print(data)
        except UnicodeEncodeError:
            pass
    else:
        pass
#主函数
#采用多线程
from multiprocessing import Pool
from Gchannel_extract import All_channnel_links
from Gpage_parsing import get_detailinfo, getdetail_links, detail_info, detail_urls


def get_all_links(channel):
    for i in range(1, 100):
        getdetail_links(channel, i)
if __name__ == '__main__':
    pool = Pool()
    pool.map(get_all_links, All_channnel_links.split())
    #断点续传功能
    db_urls = [item['url'] for item in detail_urls.find()]
    index_urls = [item['url'] for item in detail_info.find()]
    x = set(db_urls)
    y = set(index_urls)
    rest_urls = x - y
    pool.map(get_detailinfo, rest_urls)
#监控程序
import time
from Gpage_parsing import detail_urls,detail_info


while True:
    print('爬取详情页链接数量', detail_urls.find().count())
    print('爬取详情页数量', detail_info.find().count())
    print('\n')
    time.sleep(6)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容