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

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

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

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

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

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

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

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

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等等方法还需要继续研究一下),以及对整个爬取过程的控制:通常我们要获取的信息都不止在一个页面上,这就需要一个好的过程调度,保证爬取效率。

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

    原文作者:废柴社
    原文地址: https://www.jianshu.com/p/a79b094c538b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞