主要目标

爬取下图信息,上图更简单直观。

分析思路

首先找到我们要得数据在那,我们先去站长之家去看看;站长之家

这里的“全部行业”就是我们要得一级分类,我们来研究一下他的html源代码,

然后随意点开一分类看看

html源码如下:

在点进去一个,我们就看到我们要得数据在哪里了;

html内容如下:

我们看了这么多的东西有什么用呢?我总结出每级分类的url都可以在html源码里找的到,无须js,ajax等异步加载,那接下来我们看看如何分页的呢?

看到这张图我就知道这个二级分类下边有多少页内容了,但是为了保险起见,你们可以点到96页去验证,总页数得到了,我们来研究它如何分页的
这是首页url:http://top.chinaz.com/hangye/index_yule_youxi.html
这是第二页url:http://top.chinaz.com/hangye/index_yule_youxi_2.html
这是最后一页的url:http://top.chinaz.com/hangye/index_yule_youxi_96.html
因此我们可以构造“list” url,首页url唯一,不可构造
那么现在得到的结果就是这是一个很简单的list页爬取,无需处理异步,我们就来考虑要使用什么工具来抓取我们的数据了,由于这是一个很简单的应用,我们就用python2.7.12的urllib2库来抓取

代码如下:

#! -*- coding:utf-8 -*-
# __author__: andyimport random
import urllib2
import re
from time import sleep
import pymongo
from bs4 import BeautifulSoup
from agents.user_agents import agents
from filter import BloomFilterclass HangYe(object):def __init__(self):# 根urlself.root_url = "http://top.chinaz.com/hangye/"# 实例化一个连接redis的包装类,有去重,此例未用去重filter = BloomFilter()self.rconn = filter.server# 连接mongo库client = pymongo.MongoClient("10.4.252.60", 27017)# 如果mongo中有这个库就连接这个库,没有就创建这个库db = client["hangye"]# 创建表,原理同上self.shop = db['chinaz']def change_agents(self):"""设置use_agent,防止被墙,我这里有一个use_agents池,每次请求时随机从池取出一个添加到请求头里:return:"""agent = random.choice(agents)return agentdef base_request(self, url, flag):"""一个基本方法,传入url和一个标识符,每次请求时调用即可,:param url:请求的url:param flag:返回参数的标识符,为1时返回一级分类和它的url,为None时返回html内容:return:"""request = urllib2.Request(url)opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())# 设置设置use_agent,这里也可以设置其他header信息以json格式opener.add_headers = [self.change_agents()]response = opener.open(request).read()# 这里使用BeautifulSoup来树化html,你们也可以用lxml,lxml速度快一点,因为etree是c写的soup = BeautifulSoup(response, "lxml")if flag == 1:all_href = soup.find_all("div", class_="HeadFilter")[0].find_all("a")top_list = []for top_Category in all_href:top_href = top_Category['href']text_href = top_Category.get_text(strip=True)top_list.append(top_href + "--" + text_href)return top_listif flag == None:return soupdef top_category(self):"""此函数为了获取,二级分类和它的url,并和一级分类一起存入redis:return:"""top_list = self.base_request(self.root_url, 1)for hangye in top_list:top_msg = hangye.split("--")top_url = self.root_url + top_msg[0]levels = self.base_request(top_url, 1)for levels_msg in levels:l = levels_msg.split("--")line = l[0] + "--" + l[1] + "--" + top_msg[1]print line# 存数据self.rconn.lpush("hangye:crawl", line)def get_web_host(self):# 取数据msg = self.rconn.lpop("hangye:crawl")top_msg = msg.split("--")href_url = top_msg[0]# 构造 请求urllevels_url = self.root_url + href_urlhtml = self.base_request(levels_url, None)len = html.find_all("div", class_="ListPageWrap")[0].find_all("a")# 抓取此二级分类下有多少页信息len_page = re.findall(r"\d+", len[-2].get_text(strip=True))[0]l = 1while l <= int(len_page):# 判断是否是第一页,已经请求过就直接分析if l == 1:html_msg = htmlelse:index_url = href_url.split(".")[0] + "_" + str(l) + ".html"levels_url = self.root_url + index_urlprint levels_url# 请求数据,并设置flaghtml_msg = self.base_request(levels_url, None)web_host = html_msg.find_all("ul", class_="listCentent")[0].find_all("h3", class_="rightTxtHead")Chinaz = {}Chinaz['top_category'] = top_msg[2]Chinaz['level_category'] = top_msg[1]for hd in web_host:web_name = hd.find_all("a")[0].get_text(strip=True)domain = hd.find_all("span")[0].get_text(strip=True)Chinaz['web_name'] = web_nameChinaz['domain'] = domain# 抓取结果存入mongoif Chinaz:self.shop.insert(Chinaz, manipulate=False)# 将抓取过的url存入redis,方便统计。self.rconn.lpush("hangye:success", levels_url)print levels_url + "|||" + "Request Successlly !!!"l += 1try:hang = HangYe()hang.top_category()# 读取待爬队列中有多少urllen = hang.rconn.llen("hangye:crawl")while len > 0:sleep(1)hang.get_web_host()len = len -1# 读取总共抓取了多少urlsuccess = hang.rconn.llen("hangye:success")print "Crawl success Total %s pages" % success
except (KeyboardInterrupt, SystemExit):print "程序意外终止"

代码该讲的已经写在注释里了,我就不罗嗦了;我们就让它跑起来吧!

大概不到半个小时就跑完了,这是跑下来的总数据

这里是我的github地址,代码随便写的,如有失误请多多指教!!!
有时间会继续更新爬虫的,如异步加载的处理,phantomjs和selenium的使用,scrapy + splash以及scrapy大型集群的搭建和使用,欢迎大家来指正和谈论。

python爬虫,站长之家相关推荐

  1. python获取站长之家素材

    python获取站长之家素材 本文以获取站长之家动物图片为例,演示了请求对象的定制. import urllib.request as ur import os from lxml import et ...

  2. python图标icon_【Python】站长之家icon图标爬虫

    本帖最后由 lihaisanhui 于 2020-3-16 15:50 编辑 说明:我又来了!!!这次写的是站长之家的icon图标爬虫 这是一个坛友定做,我花了1上午赶工出来的,写的不好勿喷!数据源: ...

  3. python爬虫 : 汽车之家车型最新爬取解密方法

    汽车之家作为一家上市公司,本身具有强大的技术实力支持,简单的数据易爬,复杂而机密的数据,可见不可求. 如下图所示:核心的数据,在页面是找不到文字的,全是空空空空!!!和尚一样! 经过测试发现,这些数据 ...

  4. python爬虫汽车之家全车型及基本参数入数据库(截止50524个数据)(详解)

    文章目录 免责声明 一.总体思路 二.需要使用的库 三.具体实施 1.第一种方向 (1)页面1: 在售页面 停售页面 (2)页面2: 2.第二种方向 四.基本参数写入数据库 五.总结 免责声明 本人新 ...

  5. python爬虫——汽车之家数据

    相信很多买车的朋友,首先会在网上查资料,对比车型价格等,首选就是"汽车之家",于是,今天我就给大家扒一扒汽车之家的数据: 一.汽车价格: 首先获取的数据是各款汽车名称.价格范围以及 ...

  6. python爬虫----汽车之家的汽车论坛的最新精华帖

    模块 import requests---网页请求 import re---正则表达式 from bs4 import BeautifulSoup as bs---节点处理 抓取的内容 这次主要抓取汽 ...

  7. Python爬虫汽车之家全车型!你又钟意的车子吗!

    一.总体思路 目的:汽车之家官网所有的车型以及他的基本参数这些,我们知道每个车的ID不一样,那我们找到所有的ID,在找到他们的基本参数那就不是问题了. 分析网站: 闲话少说:第一种方向:是按照品牌一级 ...

  8. fiddler软件+手机模拟器搭配抓包,这篇博客有Python爬虫与百家号的事

    本篇博客为爬虫120例第60例,核心内容围绕手机抓包展开,本片练习模拟器与 Fiddler 之间的搭配 . 选择模拟器的原因也很简单,由于很多抓包软件对安卓系统有版本要求,我们不能天天给手机更换系统, ...

  9. python爬站长之家写一个信息搜集器

    前言: 不知道写什么好,绕来绕去还是写回爬虫这一块. 之前的都爬了一遍.这次爬点好用一点的网站. 0x01: 自行备好requests模块 目标站:http://tool.chinaz.com/ 0x ...

  10. python正则获取站长之家风景图,保存到本地

    # -*- coding: utf-8 -*- # !/usr/bin/env python # 获取站长之家风景图:https://sc.chinaz.com/tupian/fengjingtupi ...

最新文章

  1. 请与计算机管理员联系,电脑的限制被取消,请与管理员联系 解决方案
  2. Oracle Database 12c(12.1) Beta已经开始内部测试
  3. Tableau系列之与R语言结合
  4. c与c十十与python_浅要分析Python程序与C程序的结合使用
  5. 博客园使用highlight.js对代码进行高亮,并实现自定义关键词高亮
  6. 陈震学的什么计算机专业,一起来看看陈震学长为我们分享的前沿技术发展趋势及自己的思考吧!...
  7. c++ 获取数组的长度
  8. 使用Jedis操作redis
  9. 3.性能之巅 洞悉系统、企业与云计算 --- 操作系统
  10. 高德地图只显示某个省份
  11. LLVM之clang
  12. 飞机模拟flightgear
  13. python - 数据类型
  14. Elastic:如何摄入 Websocket 数据到 Elasticsearch
  15. 163电子邮箱,注册登陆及使用详细揭秘
  16. 想要的资源百度搜不到?6个只有老师傅才知道的网站,悄悄领走
  17. ToggleButtonBar的使用
  18. 抖音直播团队部门岗位KPI考核主播绩效制度
  19. TensorRt推理部署优化方案及流程概述
  20. 浅谈AI算力优化技术

热门文章

  1. 如何快速获取已发表学术论文的期刊封面及目录(caj格式下载和caj转pdf)
  2. 【附源码】计算机毕业设计java校园舆情监控系统设计与实现
  3. 2017春招实习面试回顾:从面试连跪到收割offer
  4. Win11找不到本地用户和组怎么办?
  5. ElementUI的时间线使用方法
  6. 在win10上开启vnc server但无法控制的解决方案
  7. 基于GMap.Net的地图解决方案
  8. word2016中应用or关闭中文字体到西文字体/设置默认字体
  9. 在线扫描服务器文件大小,还在找在线扫描文档并上传为图像的扫描工具?Dynamic Web TWAIN满足您的需求!...
  10. 市场调研报告-低浓度阿托品市场现状及未来发展趋势