爬虫:爬取58同城

本来想爬取一些由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

以上

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 声明:本文讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途! 一、前言 强烈建议:请在电脑的陪同下,阅读本文...
    Bruce_Szh阅读 12,783评论 6 28
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,934评论 0 15
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,316评论 25 708
  • 我总想要深刻一点,不满足于生活的肤浅。仿佛有点偏执,比起物质主义的人,更加不容易幸福。形而上的追寻,往往更加难以满...
    2小阅读 410评论 0 2
  • 周一的上午,公司例会的气氛异常紧张,西装革履的林进茂坐在会议室中间一把手的位置上边刷朋友圈,边听在座的五位部门负责...
    贰丰阅读 258评论 1 0