Python实战计划学习笔记:week2_2 爬取手机号

学习爬虫第二周,爬取58同城手机号码,网址如下所示。

网页预览.png

按照学习的情况,首先需要对网页进行分析,观察页面结构。

观察页面特征:
针对大规模数据抓取,观察页面结构特征,编写的程序有没有通用性,能不能适用于所有页面。发现边界条件,找到局限性。

其次需要对程序的工作流程进行设计。

设计工作流程
搞清楚了程序根据页面如何设计之后,制定有效的工作流,保证抓取中程序的高效执行。工作输出效率更稳定。

1.大规模抓取数据,我们要知道边界在哪里,经过对网页的查询:

http://bj.58.com/shoujihao/pn{}.format(page)

我们发现当输入到pn117时,页面数据已经没有了。

同时对网页的中的titles和links进行元素位置查找,并抓取存进Mongo中,此处存储的为网页上所有手机号title的详情页的url链接。


2.经过对网页的分析,适合我们的网站是这样的:

right.png

不适合的网站是这样的:

error.png

因此在Spider2的详情页面抓取时,需要按照正确的网页结构元素进行抓取。

同时对网页中需要的元素进行抓取。

代码如下:

#!/usr/bin/env python
# coding: utf-8

from bs4 import BeautifulSoup
import requests
import time
import pymongo

#create the database
client = pymongo.MongoClient('localhost',27017)
#name:Phone
Phone = client['Phone']

#table:phone_numbers 存储手机号的表
phone_numbers = Phone['phone_numbers']
#table:phone_info  详细信息
phone_info = Phone['phone_info']





#infocont > span > b

#Spider1  提取链接
def get_links_from(page):
    url = 'http://bj.58.com/shoujihao/pn{}/'.format(page)
    wb_data = requests.get(url)
    time.sleep(1)
    Soup = BeautifulSoup(wb_data.text,'lxml')
    titles = Soup.select('#infolist > div > ul > div > ul > li > a.t > strong')
    links = Soup.select('#infolist > div > ul > div > ul > li > a.t')
    for title,link in zip(titles,links):
        data = {
            'title':title.get_text(),
            'link':link.get('href')
        }

        phone_numbers.insert_one(data)

#Spider2  详细页面
def get_item_from(url):
    wb_data = requests.get(url)
    time.sleep(1)
    Soup = BeautifulSoup(wb_data.text,'lxml')
    titles = Soup.select('#main > div.col.detailPrimary.mb15 > div.col_sub.mainTitle > h1')
    prices = Soup.select('#main > div.col.detailPrimary.mb15 > div.col_sub.sumary > ul > li > div.su_con > span')
    for title,price in zip(titles,prices):
        title = title.get_text().replace('\n','').replace('\t','').replace(' ','')
        price = price.get_text().replace('\n','').replace('\t','').replace(' ','')
        data  = {
         'title':title,
         'price':price,
         'url':url
        }
        print(data)
        phone_info.insert_one(data)



for page in range(1,117):   #抓取所有页面
    get_links_from(page)

for info in phone_numbers.find():  #从数据库中抓取存储的url
    url = info['link']
    get_item_from(url)

运行结果截图:

phone_number中的数据:

存储手机号的表.png

phone_info中的数据:

详细信息.png

总结:

  • 进一步加深理解爬取大数据的工作流的思想和设计模式。

  • 编程功能的模块化思想,比如对Spider1,Spider2的设计,如何保障任务工作的有效执行,尽量进行任务的解耦。

  • 数据库使用的进一步学习。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,663评论 25 708
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,815评论 1 92
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,010评论 19 139
  • 最近由于复习考试,把其他事都暂时放下来了。在十月初加入了坚持星球演讲训练营,本来每天都有早读和晚读,但是读了几天后...
    biliali阅读 139评论 0 0
  • 12月份刚到,意味着寒假马上就要到了。接近期末,对于大二大三的同学来说,又到了他们忙着找实习的时候了。 对于大三的...
    那年名为彭公子阅读 27,950评论 15 54