美文网首页
爬虫:爬取58同城

爬虫:爬取58同城

作者: 泠泠七弦客 | 来源:发表于2016-08-04 09:00 被阅读0次

本来想爬取一些由js加载的数据(浏览人数),但是这个页面改版了,浏览人数直接呈现的。并且成色,发布日期两项都没有了,所以本次爬虫基本还是之前的套路。

结果
from bs4 import BeautifulSoup
import requests
import json
import time

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


# 发帖时间,成色没有
def request_details(url):
   f = requests.get(url, headers=headers)
    soup = BeautifulSoup(f.text, 'lxml')
    category = soup.select('div.breadCrumb.f12 > span:nth-of-type(4)')
    title = soup.select('h1.info_titile')
    price = soup.select('span.price_now > i')
    area = soup.select('div.palce_li > span > i')
    view_num = soup.select('span.look_time')

    data = {
        'title': title[0].text,
        'category': category[0].text.strip(),
        'price': price[0].text,
        'area': area[0].text,
        'view_num': view_num[0].text
    }
    return data
   

def get_link(url):
    f = requests.get(url)
    soup = BeautifulSoup(f.text, 'lxml')
    links = soup.select('zzinfo > td.img > a')
    link_list = []
    for link in links:
        link_content = link.get('href')
        link_list.append(link_content)
    return link_list


def save_to_text(content):
    content = json.dumps(content, ensure_ascii=False)
    with open('58', 'a', encoding='utf-8') as f:
        f.write(content)
        f.write('\r\n')


def main():
    link = 'http://bj.58.com/pbdn/0/pn{}'
    start = 1
    end = 10
    urls = [link.format(i) for i in range(start, end)]
    for url in urls:
        link_list = get_link(url)
        for link in link_list:
            content = request_details(link)
            time.sleep(1)
            print(content)
            save_to_text(content)


if __name__ == '__main__':
    main()

这个跟之前爬取的小猪短租别无二致,所以需要总结的不多,说说其中遇到的一些问题吧!

  • 之前没有挂代理,所以58阻止了爬虫进行,于是加了代理headers
  • 爬取的部分数据需要处理,用了strip()方法截取了字符前后的空格
  • 又忘记了写入text文本的方法,牢记,这个查着不好查
def save_to_text(content):
    content = json.dumps(content, ensure_ascii=False)
    with open('58', 'a', encoding='utf-8') as f:
        f.write(content)
  • 在select有些类的时候,在HTML中显示的比方说ifo t,中间有空格,但是写在path中就必须加'_'这个下划线,也就是用下划线代替空格
  • 不在使用zig来做循环了,实际上,每次爬取页面就只有那么一个东西,所以就用title[0].text来保证,[0]是选取列表第一个元素(就只有一个元素),text就是get_text()的作用
    总结:
    1.先写出爬出一个详细页面的爬虫
    2.在从预览页面爬取进入详细页面的跳转连接
    3.添加预览页面的list,然后加入for循环,使得每个预览页面都爬取其所有的详细页面。
    4.可以选择保存进text
    5.爬取浏览量,假设是js加载的
    比方这个是js加载的,我们就想办法生成这个申请地址,这个申请地址的区别就是里面的一串id,而这个id有存在在url中,所以我们可以获取url,然后截取id,再拼装成申请地址
    代码:
    1.从网页的url解析出来id
    2.把id加进api申请网址中,
    3.申请,得到返回
    4.注意的问题是这里面可能还需要用到headers,具体碰到了注意一下
    Paste_Image.png

以上

相关文章

网友评论

      本文标题:爬虫:爬取58同城

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