scrapy爬虫系列之二--翻页爬取及日志的基本用法
功能点:如何翻页爬取信息,如何发送请求,日志的简单实用
爬取网站:腾讯社会招聘网
完整代码:https://files.cnblogs.com/files/bookwed/tencent.zip
主要代码:
job.py
# -*- coding: utf-8 -*-
import scrapy
from tencent.items import TencentItem
import logging # 日志模块 logger = logging.getLogger(__name__) class JobSpider(scrapy.Spider):
"""职位爬虫"""
name = 'job'
allowed_domains = ["tencent.com"]
offset = 0
baseUrl = "https://hr.tencent.com/position.php?start={}"
start_urls = [baseUrl.format(offset)] def parse(self, response):
# //tr[@class="even" or @class="odd"]
# xpath(),返回一个含有selector对象的列表
job_list = response.xpath("//tr[@class='even'] | //tr[@class='odd']")
for job in job_list:
item = TencentItem()
# extract() 提取字符串,返回一个包含字符串数据的列表
# extract_first(),返回列表中的第一个字符串
# extract()[0] 可以替换成extract_first(),不用再进行判断是否为空了
item["name"] = job.xpath("./td[1]/a/text()").extract_first()
item["url"] = job.xpath("./td[1]/a/@href").extract()[0]
item["type"] = job.xpath("./td[2]/text()")
item["type"] = item["type"].extract()[0] if len(item["type"]) > 0 else None
item["people_number"] = job.xpath("./td[3]/text()").extract()[0]
item["place"] = job.xpath("./td[4]/text()").extract()[0]
item["publish_time"] = job.xpath("./td[5]/text()").extract()[0]
# 打印方式1
# logging.warning(item)
# 打印方式2,【推荐,可以看到是哪个文件打印的】
logger.warning(item)
# 为什么使用yield?好处?
# 让整个函数变成一个生成器。每次遍历的时候挨个读到内存中,不会导致内存的占用量瞬间变高
yield item # 第一种:拼接url
# if self.offset < 3090:
# self.offset += 10
# url = self.baseUrl.format(self.offset)
# yield scrapy.Request(url, callback=self.parse) # yield response.follow(next_page, self.parse) # 第二种:从response获取要爬取的链接,并发送请求处理,知道链接全部提取完
if len(response.xpath("//a[@class='noactive' and @id='next']")) == 0:
temp_url = response.xpath("//a[@id='next']/@href").extract()[0]
# yield response.follow("https://hr.tencent.com/"+temp_url, callback=self.parse)
yield scrapy.Request(
"https://hr.tencent.com/"+temp_url,
callback=self.parse,
# meta={"item": item} # meta实现在不同的解析函数中传递数据
# dont_filter=True # 重复请求
) # 此处的callback指返回的响应由谁进行解析,如果和第一页是相同的处理,则用parse,否则定义新方法,指定该新方法 def parse1(self, response):
item = response.meta["item"]
print(item)
print("*"*30)
pipelines.py
import json class TencentPipeline(object):
# 可选实现,参数初始化等
def __init__(self):
self.f = open('tencent_job.json', 'w', encoding='utf-8') def process_item(self, item, spider):
# item(Item对象) - 被爬取的item
# spider(Spider对象)- 爬取item时的spider;通过spider.name可以获取爬虫名称
content = json.dumps(dict(item), ensure_ascii=False)+",\n"
self.f.write(content)
return item def open_spider(self, spider):
# 可选,spider开启时,该方法被调用
pass def close_spider(self, spider):
# 可选,spider关闭时,该方法被调用
self.f.close()
scrapy爬虫系列之二--翻页爬取及日志的基本用法的更多相关文章
- 爬虫简单之二---使用进程爬取起点中文网的六万多也页小说的名字,作者,等一些基本信息,并存入csv中
爬虫简单之二---使用进程爬取起点中文网的六万多也页小说的名字,作者,等一些基本信息,并存入csv中 准备使用的环境和库Python3.6 + requests + bs4 + csv + multi ...
- 爬虫系列4:Requests+Xpath 爬取动态数据
爬虫系列4:Requests+Xpath 爬取动态数据 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参 ...
- Scrapy分布式爬虫打造搜索引擎- (二)伯乐在线爬取所有文章
二.伯乐在线爬取所有文章 1. 初始化文件目录 基础环境 python 3.6.5 JetBrains PyCharm 2018.1 mysql+navicat 为了便于日后的部署:我们开发使用了虚拟 ...
- 爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP
爬虫1:Requests+Xpath 爬取豆瓣电影TOP [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]: ...
- scrapy爬虫笔记(三)------写入源文件的爬取
开始爬取网页:(2)写入源文件的爬取 为了使代码易于修改,更清晰高效的爬取网页,我们将代码写入源文件进行爬取. 主要分为以下几个步骤: 一.使用scrapy创建爬虫框架: 二.修改并编写源代码,确定我 ...
- 爬虫系列3:Requests+Xpath 爬取租房网站信息并保存本地
数据保存本地 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参考前文 爬虫系列2:https://www ...
- 爬虫系列2:Requests+Xpath 爬取租房网站信息
Requests+Xpath 爬取租房网站信息 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参考前文 ...
- 爬虫系列(1)-----python爬取猫眼电影top100榜
对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天在整理代码时,整理了一下之前自己学习爬虫的一些代码,今天先上一个简单的例子,手把手教你入门Python爬虫,爬取 ...
- Scrapy实战篇(二)之爬取链家网成交房源数据(下)
在上一小节中,我们已经提取到了房源的具体信息,这一节中,我们主要是对提取到的数据进行后续的处理,以及进行相关的设置. 数据处理 我们这里以把数据存储到mongo数据库为例.编写pipelines.py ...
随机推荐
- “Chaos”的算法之Floyd算法
倘若我们要在计算机上建立一个交通咨询系统则可以采用图的结构来表示实际的交通网络.其实现最基本的功能,求出任意两点间的最短路径, 求最短路径的经典方法有很多种,最常用的便是迪杰斯特拉算法和佛洛依德(Fl ...
- 基于swoole扩展实现真正的PHP数据库连接池
转自: http://rango.swoole.com/archives/265 PHP的数据库连接池一直以来都是一个难题,很多从PHP语言转向Java的项目,大多数原因都是因为Java有更好的连接 ...
- c++ 在线编译
#include <algorithm> #include <cstdlib> #include <fstream> #include <iostream&g ...
- android SDK manager 快速更新【转】
- HE算法与Scaler算法
HE算法:图像直方图均衡化 Scaler算法:图像缩放 基于matab的scaler实现_图文_百度文库 https://wenku.baidu.com/view/016f5e4002768e9951 ...
- Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(一)
题外话:本篇是对之前那篇的重排版.并拆分成两篇,免得没了看的兴趣. 前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的 ...
- B-J UI框架(前端异步框架)
B-JUI 客户端框架 http://xiangzhanyou.com/B-JUI
- 【RF库Collections测试】Count Values In List
Name:Count Values In ListSource:Collections <test library>Arguments:[ list_ | value | start=0 ...
- NPOI抓取WPS表格保存的EXCEL文件
其实是可以抓取的,唯一不同就是Sheet的位置前进了一位. var sheet1 = (HSSFSheet)hssfworkbook.GetSheetAt(1); 来自为知笔记(Wiz ...
- PyQt4关闭窗口
一个显而易见的关闭窗口的方式是但集标题兰有上角的X标记.接下来的示例展示如何用代码来关闭程序,并简要介绍Qt的信号和槽机制. 下面是QPushButton的构造函数,我们将会在下面的示例中使用它. Q ...