文章只是我作为NewBird ٩꒰▽ ꒱۶⁼³₌₃ 学习的一小点小点的进步
还请不要笑我⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
我就直接贴代码了,我不会说很技术的话。
1.创建项目命令:
scrapy startproject <project_name>
例子:
scrapy startproject myproject
创建成功如下图:
文件夹目录如下
1
2
3
4
5
6
7
8
9
10
|
myproject/
scrapy.cfg -------项目的配置文件
myproject/ -------该项目的python模块。之后您将在此加入代码。
__init__.py
items.py --------项目中的item文件.
pipelines.py --------项目中的pipelines文件
settings.py --------项目的设置文件
spiders/ --------放置spider代码的目录
__init__.py
...
|
以上复制了别人的https://www.cnblogs.com/pachongshou/p/6125858.html
2.明确目标——Item.py
import scrapy
class Doutu2Item(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
img_url=scrapy.Field()
name=scrapy.Field()
3.制作爬虫,先爬再取——spider.py
# -*- coding: utf-8 -*-
import scrapy
from ..items import Doutu2Item
from pyquery import PyQuery as pq
import os
import requests
from urllib import request
import re
class DoutuSpider(scrapy.Spider):
name = 'doutu'
allowed_domains = ['doutula.com']
start_urls = ['http://doutula.com/photo/list/?page={}'.format(i)for i in range(1,3)]
def parse(self, response):
jpy=pq(response.text)
#我这里使用了PyQuery
Zurl=jpy('#pic-detail > div > div.col-sm-9 > div.random_picture > ul > li > div > div>a').items()
i=0
for it in Zurl:
#遍历Zurl
print(it.text())
#实例化item对象,进行存储
item=Doutu2Item()
#PyQuery中获取属性attr()
#以下是动图和jpg的url获取
item['img_url']=it('img').attr('data-original')
item['name']=it('p').text()
if not item['img_url']:
item['img_url']=it('img').eq(1).attr('data-original')
print(item['img_url'])
i+=1
# if os.path.exists('斗图'):
# print('文件夹已存在')
# else:
# os.makedirs('斗图')
# print('文件夹已经创建')
if not os.path.exists('doutu'):
print('创建文件夹:{}'.format('doutu'))
os.mkdir('doutu')
if not os.path.exists('pic'):
print('创建文件夹:{}'.format('pic'))
os.mkdir('pic')
#正则表达式替换名称中有特殊字符的
rstr = r"[\/\\\:\*\?\"\<\>\|]" # '/ \ : * ? " < > |'
new_title = re.sub(rstr, "_", item['name']) # 替换为下划线
#第一种存储方式:打开文件路径的时候我不太会弄,所以错了几次,相对路径比较好,
with open('pic/%s.jpg' % new_title,'wb') as f:
f.write(requests.get(item['img_url']).content)
#第二种存储方式
try:
request.urlretrieve(item['img_url'],'doutu\%s.gif'% new_title)
except:
pass
print(i)
print('__________________________________________________')
yield item
4.处理spider抽取的item——pipeline.py
from scrapy.exceptions import DropItem
from scrapy import log
import json
from pymongo import MongoClient
from scrapy.conf import settings
class Doutu2Pipeline(object):
#这里是初始化方法
#进行数据库的一些设置
def __init__(self):
connection=MongoClient(
settings['MONGODB_SERVER'],
settings['MONGODB_PORT']
)
db=connection[settings['MONGODB_DB']]
self.collection=db[settings['MONGODB_COLLECTION']]
def process_item(self, item, spider):
self.collection.insert(dict(item))
print("我已进入数据库")
valid=True
for data in item:
if not data:
valid=False
raise DropItem('MIssing{}'.format(data))
if valid:
log.msg('已经进入数据库',level=log.DEBUG,spider=spider)
return item
__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的 初始化 。注意,这个名称的开始和结尾都是双下划线
5.配置文件——setting.py
# Scrapy settings for doutu2 project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
# http://doc.scrapy.org/en/latest/topics/settings.html
# http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
# http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html
BOT_NAME = 'doutu2'
SPIDER_MODULES = ['doutu2.spiders']
NEWSPIDER_MODULE = 'doutu2.spiders'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
# Configure maximum concurrent requests performed by Scrapy (default: 16)
CONCURRENT_REQUESTS = 32
# Configure a delay for requests for the same website (default: 0)
# See http://scrapy.readthedocs.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 0.2
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16
# Disable cookies (enabled by default)
COOKIES_ENABLED = False
# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False
# Override the default request headers:
#DEFAULT_REQUEST_HEADERS = {
# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
# 'Accept-Language': 'en',
#}
# Enable or disable spider middlewares
# See http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html
SPIDER_MIDDLEWARES = {
'doutu2.middlewares.Doutu2SpiderMiddleware': 543,
}
# Enable or disable downloader middlewares
# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
# 'doutu2.middlewares.MyCustomDownloaderMiddleware': 543,
#}
# Enable or disable extensions
# See http://scrapy.readthedocs.org/en/latest/topics/extensions.html
#EXTENSIONS = {
# 'scrapy.extensions.telnet.TelnetConsole': None,
#}
# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'doutu2.pipelines.Doutu2Pipeline': 300,
}
MONGODB_SERVER = "localhost"
MONGODB_PORT = 27017
MONGODB_DB = "test"
MONGODB_COLLECTION = "doutu2"
6.中间件进行request和response一些设置——middlewares.py
这个暂时还不怎么U