美文网首页Python精选生活不易 我用python
动手写爬虫(2):爬取58同城二手物品信息

动手写爬虫(2):爬取58同城二手物品信息

作者: 废柴社 | 来源:发表于2016-05-07 13:24 被阅读1326次

    工作这么多年一直想学习一下爬虫技术,各种尝试之后发现学习的最好方式就是直接开干:那就找一个想爬的东西开始爬啊!
    从模仿用正则表达式爬取,到现在通过网络课程学习使用BeatifulSoup库来爬取信息,大概花了一个月左右的零散时间,感觉还是有些进步的,得记录一下,现在就分享一下58同城二手物品信息的爬取过程。

    1.分析爬取目标页面与目标

    58同城二手物品页面开始,爬取该页面中二手物品详细信息。
    详细信息分布在子页面中,故,需要先从主页面获取子页面的链接,再从子页面中获取我们的目标信息。这样把爬取过程分成了两部分:
    - 爬主页面获取二手物品子页面的信息;
    -爬取子页面(页面示例)获取对应二手物品的标题、价格、成色、区域、发布日期、类别等信息。
    对应的,我们查看对应的页面,**确定所需要爬取的元素在对应页面中所处的位置、确定获取方式。

    2. 爬取主页面中的二手物品链接

    通过chrome检查主页面在对应二手物品标题位置右键、检查,查看链接对应的网页元素位置,复制对应的位置表述,如下:

    复制结果即是对应的链接位置表述:

    infolist > table:nth-child(7) > tbody > tr:nth-child(2) > td.t > a

    由于网页构成中td标签、t样式下的a标签对应的内容都是子页面链接,故可以用‘td.t > a’作为筛选条件,通过BeautifulSoup中的select方法对其进行筛选。代码见最后部分。(注:代码中对业面中的一些特殊物品类别进行了剔除,包括转转页面、推荐信息部分等)

    3. 爬取子页面中物品详细信息

    将上一步获取的子页面链接传递给
    过程与提取主页面中链接是一样的,不过这次需要提取的元素多了一些,我们按上述过程逐个检查,确定元素对应的筛选表述。
    最后通过get_text等方式,将所需信息从爬取的元素中提取出来。

    4.完整的python代码

    from bs4 import BeautifulSoup
    import time
    import requests
    
    url_58 = 'http://bj.58.com/pbdn/0/'
    
    def get_url_list(url):
        web_data = requests.get(url)
        soup = BeautifulSoup(web_data.text,'lxml')
        url = soup.select('td.t > a[class="t"]')
        url_list = ''
        for link in url:
            link_i = link.get('href')
            if 'zhuanzhuan'in link_i:
               pass
            else:
                if 'jump' in link_i:
                    pass
                else:
                    url_list = url_list + '\n'+link_i
        print('urllist',url_list)
        return url_list
    
    def get_info():
        url_list = get_url_list(url_58)
        for url in url_list.split():
            time.sleep(1)
            web_data = requests.get(url)
            soup = BeautifulSoup(web_data.text,'lxml')
    
            type = soup.select('#header > div.breadCrumb.f12 > span:nth-of-type(3) > a')
            title = soup.select('div.col_sub.mainTitle > h1')
            date = soup.select('li.time')
            price = soup.select('div.person_add_top.no_ident_top > div.per_ad_left > div.col_sub.sumary > ul > li:nth-of-type(1) > div.su_con > span.price.c_f50')
            fineness = soup.select('div.col_sub.sumary > ul > li:nth-of-type(2) > div.su_con > span')
            area = soup.select('div.col_sub.sumary > ul > li:nth-of-type(3) > div.su_con > span')
    
            #print(type,title,date,price,fineness,area)
    
            for typei,titlei,datei,pricei,finenessi,areai in zip(type,title,date,price,fineness,area):
                data = {
                    'type':typei.get_text(),
                    'title':titlei.get_text(),
                    'date':datei.get_text(),
                    'price':pricei.get_text(),
                    'fineness':(finenessi.get_text()).strip(),
                    'area':list(areai.stripped_strings)
                }
                print(data)
    
    get_info()
    

    5.最终结果样例

    {'area': ['通州', '-', '物资学院路'], 'title': 'iPad mini 2 Wi-Fi 16G 白色 港版', 'date': '2016-05-07', 'type': '北京二手平板电脑', 'fineness': '-', 'price': '1200'}
    {'area': ['西城', '-', '西单'], 'title': 'iPad2 16G 国行 WiFi 平板电脑', 'date': '2016-05-07', 'type': '北京二手平板电脑', 'fineness': '-', 'price': '900'}

    6.总结

    其实从网页中提取对应元素并不复杂,麻烦的是反爬、对目标信息进行提取(get_text、stripped_strings等等方法还需要继续研究一下),以及对整个爬取过程的控制:通常我们要获取的信息都不止在一个页面上,这就需要一个好的过程调度,保证爬取效率。

    以上仅供学习,请勿用于商业用途。

    相关文章

      网友评论

        本文标题:动手写爬虫(2):爬取58同城二手物品信息

        本文链接:https://www.haomeiwen.com/subject/rpudrttx.html