python爬虫----scrapy框架使用
程序员文章站
2022-05-06 20:32:14
...
1.起项目(cmd)
爬取图片,项目名称So,爬虫程序so.py
url链接:http://image.so.com/zj?ch=beauty&sn=90&listtype=new&temp=1
- scrapy startproject So
- cd So
- scrapy genspider so image.so.com #爬虫程序名和目标域名
2.管道文件 items.py
定义要爬取的数据结构
class SoItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 图片链接
imgLink = scrapy.Field()
3.爬虫程序 so.py
关于start_requests()的说明:该方法scrapy框架已写好,爬虫程序从该方法开始执行,将start_urls发给调度器,并指定回调函数为parse函数,parse函数将页面解析后将item对象发给管道,此处对该方法进行了重写,并指定了其他解析函数
import json, scrapy
from urllib import parse
from So.items import SoItem
class SoSpider(scrapy.Spider):
name = 'so'
# 允许爬取的域名
allowed_domains = ['http://image.so.com']
# start_urls = ['http://image.so.com/zj?ch=beauty&sn=90&listtype=new&temp=1']
baseurl = 'http://image.so.com/zj?'
# 重写start_requests()方法
def start_requests(self):
# 拼接url地址
for page in range(3):
params = {
'ch': 'beauty',
'sn': str(page*30),
'listtype': 'new',
'temp': '1'
}
# 拼接成一个完整的url地址
url = self.baseurl + parse.urlencode(params)
# 将完整的url地址发给调度器,并指定回调函数
yield scrapy.Request(url,callback=self.parseImg)
def parse(self, response):
pass
def parseImg(self,response):
# 创建管道对象
item = SoItem()
# 获取响应的文本内容(此项目链接返回的是json)
html = response.text
# 将json转为字典
d = json.loads(html)
# 直接遍历字典中list键对应的列表,列表中为字典
for img in d['list']:
item['imgLink'] = img['qhimg_url']
yield item
补充一个文本信息的爬虫程序
scrapy中xpath提取出的是选择器对象的列表
response.xpath(’’) >>>> 结果 :[<selector … data=‘文本内容’>,<…>]
可通过extract()方法获取选择器对象中的文本内容
response.xpath(’’).extract() >>>> 结果 :[‘文本内容1’,‘文本内容2’,…]
import scrapy
from Tengxun.items import TengxunItem
class TengxunSpider(scrapy.Spider):
name = 'tengxun'
allowed_domains = ['hr.tencent.com']
start_urls = ['https://hr.tencent.com/position.php?start=0']
baseurl = 'https://hr.tencent.com/position.php?start='
#start_urls访问后会返回给parse函数,后续则返回给指定的回调函数
def parse(self, response):
# 把要爬取的url地址交给调度器,重复的链接调度器将不再安排下载
for page in range(0,3120,10):
url = self.baseurl + str(page)
# 交给调度器,并指定解析函数
yield scrapy.Request(url,callback=self.getHtml)
def getHtml(self,response):
item = TengxunItem()
# 用xpath解析页面,获得选择器对象的列表
baseList = response.xpath('//tr[@class="even"] | //tr[@class="odd"]')
for base in baseList:
# 通过extract()方法获取选择器对象中的文本内容
item['zhName'] = base.xpath('./td[1]/a/text()')[0].extract()
item['zhType'] = base.xpath('./td[2]/text()')
if item['zhType']:
item['zhType'] = item['zhType'][0].extract()
else:
item['zhType'] = '无'
item['zhNum'] = base.xpath('./td[3]/text()')[0].extract()
item['zhAddress'] = base.xpath('./td[4]/text()')[0].extract()
item['zhTime'] = base.xpath('./td[5]/text()')[0].extract()
item['zhLink'] = base.xpath('./td[1]/a/@href')[0].extract()
yield item
4.管道文件 pipelines.py
#导入scrapy的图片管道类
from scrapy.pipelines.images import ImagesPipeline
import scrapy
# 继承自ImagesPipeline
class SoPipeline(ImagesPipeline):
# 重写ImgesPipeline的方法
def get_media_requests(self, item, info):
# 将链接发给调度器入队列,调度器会将图片保存到settings.py中的
# IMAGES_STORE 变量的路径中
yield scrapy.Request(item['imgLink'])
补充一个管道文件
import pymongo
# 导入settings文件中关于数据库的配置信息
from .settings import *
class TengxunPipeline(object):
def __init__(self):
# 初始化数据库配置
self.conn = pymongo.MongoClient(MONGO_HOST,MONGO_PORT)
self.db = self.conn['tengxundb']
self.myset = self.db['tengxunPost']
# 此方法名固定写法
def process_item(self, item, spider):
d = dict(item)
self.myset.insert_one(d)
# 必须返回item,可供其他管道继续使用
return item
5.修改配置 settings.py
# 取消robots协议
ROBOTSTXT_OBEY = False
# 设置线程数,默认16
#CONCURRENT_REQUESTS = 32
# 开启默认请求头,需要大量User-Agent时可单独设置
DEFAULT_REQUEST_HEADERS = {
'User-Agent': 'Mozilla/5.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
# 开启项目管道
ITEM_PIPELINES = {
'So.pipelines.SoPipeline': 300,
}
# 图片的存储路径
IMAGES_STORE = 'C:\\Users\\Administrator\\Desktop\\AID1810\\code\\17spider\\day08\\images'
6.项目启动:创建begin.py(和scrapy.cfg文件同目录)
from scrapy import cmdline
cmdline.execute('scrapy crawl so'.split())
上一篇: 简单的网络爬虫代码
下一篇: 基于python3的简单网络爬虫示例