初学Scrapy
1、items.py 像字典一样
定义所爬取信息的名字,相当于规定好要提取信息的Key键
2.spiders包中 用来请求和解析
默认起始爬取链接、request请求、def parse()解析函数
(可以重定义request,修改url、请求头、cookies)
返回url需要再回调解析函数,最终爬取的信息,作为参数传递给items,封装成类似字典,进入管道
3、pipelines.py 下载和保存所提取的信息
open函数,写入文件
4、settings.py 开启管道、cookies、robot协议等开关
一、创建项目和项目文件,运行项目
cmd命令行中输入
1.创建项目:
scrapy startproject 项目名字
切换到项目目录下
2.创建项目文件:
scrapy genspider 文件名 爬取的目标主域名
3.运行项目
命令行中输入和创建main.py文件都可以
main.py
-
from scrapy import cmdline
-
-
cmdline.execute('scrapy crawl fofa'.split())
-
-
# 加.split()分隔下 'scrapy crawl fofa'会有空格,避免输入错误,也是支持运行的
二、所需信息名字,封装到items中
把需要信息的类别名字封成类似字典容器一样,相当于以后爬取信息的标头Key键
items.py
-
import scrapy
-
-
-
class SqUrlItem(scrapy.Item):
-
-
urls=scrapy.Field()
-
ips=scrapy.Field()
三、自定义request请求头和cookies,多页爬取
spiders包中,项目文件.py
-
import scrapy
-
from fake_useragent import UserAgent
-
from ..items import SqUrlItem
-
-
class FofaSpider(scrapy.Spider):
-
-
# 作为启动时候的名字,唯一性
-
name = 'fofa'
-
# 允许爬取的主域名
-
allowed_domains = ['fofa.info']
-
# 启动的初始连接,后期如果重写request请求这个就不管用了
-
# start_urls = ['http://fofa.info/']
-
-
# 自定义的请求头,cookies需要单独拿出来
-
headers = {
-
'Accept': ''
-
'Accept-Encoding': '',
-
'Accept-Language': '',
-
'Cache-Control': '',
-
'Connection': '',
-
'Host': '',
-
'If-None-Match': '""',
-
'Referer': '/',
-
'Sec-Fetch-Dest': 'dt',
-
'Sec-Fetch-Mode': 'n',
-
'Sec-Fetch-Site': n',
-
'Sec-Fetch-User': '',
-
'Upgrade-Insecure-Requests': '',
-
'User-Agent': str(UserAgent().Chrome),
-
'sec-ch-ua': '"Google Chro',
-
'sec-ch-ua-mobile': '',
-
'sec-ch-ua-platform': '"Wi"'}
-
-
-
# 自定义cookies 需要去setting开启 ‘COOKIES_ENABLED = True’
-
cookies = {'9b7bd7f2f5cf989': '16241',
-
'_cd': 'rsHRaus34',
-
'befuter': '%F',
-
'user': D',
-
'baseShowChange': 'false',
-
'f57f67dfb76eedcf989': '17876576'
-
}
-
-
-
# 多页爬取,相同部分的链接
-
base_url='https://fofa.info/rqbG9mIGNvdW50D&page='
-
# 变动的是page页面数字
-
page=1
-
-
# 重写requests函数
-
def start_requests(self):
-
url = 'https://fofa.info/result?qbmIGNvd=&page=1&page_=20'
-
-
# 默认自动请求回来的回应,进入parse()函数去解析,当然也可以自己重新定义回调函数callback=下一步的函数
-
return [scrapy.FormRequest(url=url, headers=self.headers, cookies=self.cookies)]
-
-
# 相当于解析器,用xpath和css都可以,解析器返回的是列表形式
-
def parse(self, response):
-
# 先提出出来一组相同框架的元素
-
show_list = response.xpath('//div[@class="showListsContainer"]//div[@class="result-item"]')
-
-
# 遍历后,从框架中,定位所需要的信息,extract()是提取里面的data元素是个列表,extract_first是提取的第一个是字符串
-
for show in show_list:
-
# 提取a标签下的href属性文本
-
urls = show.xpath('.//div[@class="aeft"]//span[2]/a/@href').extract_first()
-
# 提取的a标签下的文本
-
ips = show.xpath('.//div[@class="innontLeft"]/p[2]/a/text()').extract_first()
-
-
# 爬取的信息去items文件中加工成类似字典形式,作为参数,创建items文件中类对象
-
urls_ips = SqUrlItem(urls=urls, ips=ips)
-
-
# yield相当于出来一个对象返回出去,进入pipelines管道中
-
yield urls_ips
-
-
# 多页爬取,设置的是页码,第一页已经爬取了,去掉第一页
-
if self.page<24:
-
self.page = 1
-
-
# 拼接剩下页码的url
-
url_page=self.base_url str(self.page) '&page_=20'
-
-
# 一个个新的url再去请求,再回调parse解析去,最终爬取的信息以items对象进入了管道
-
yield scrapy.Request(url=url_page,headers=self.headers,cookies=self.cookies,callback=self.parse)
-
post 请求
链接提取(多页)
有些网站不显示多少页,隐藏页数
定位链接元素
1. 用正则提取,代码如下
-
# 匹配每页符合这个规则元素,自动提取成链接,follow参数关闭只是提取的当前匹配共13页
-
-
打开,是跟踪所有的链接
-
-
-
allowed_domains = ['www.dushu.com']
-
start_urls = ['https://www.dushu.com/book/1188_1.html']
-
-
-
rules = (
-
Rule(LinkExtractor(allow=r'/book/1188_\d .html'), callback='parse_item', follow=True),
-
)
-
-
# 结尾加‘,’
还可以在建立项目文件的时候,多添加,-t crawl 自动生成包含rules框架文件
2. 使用xpath提取链接
3.使用css提取链接
多层爬取案例:
1.从第一层解析器函数中,返回第二层的url继续解析第二层
2.mata参数,用于封装第一层爬取的信息,传递到第二层,所有的信息再一起创建Items对象
给管道去下载
-
class DbSpider(scrapy.Spider):
-
name = 'db'
-
allowed_domains = ['www.exploit-db.com']
-
start_urls = ['http://www.exploit-db.com/']
-
-
headers = {'User-Agent': str(UserAgent().Chrome),
-
'referer': '',
-
'accept': '',
-
'x-requested-with': ''
-
}
-
-
def start_requests(self):
-
-
url=''
-
return [scrapy.FormRequest(url=url,headers=self.headers)]
-
-
-
-
def parse(self, response):
-
-
# 返回的是json文件
-
re_js=json.loads(response.text)
-
-
re_datas=re_js['data']
-
for i in range(10):
-
re_data=re_datas[i]
-
-
# 取到的是字符串中带标签
-
Titles_dict=re_data['url_title']
-
-
# 将字符串标签解析成html,取文本
-
Titles=BeautifulSoup(Titles_dict,'lxml').text
-
-
Ids=re_data['id']
-
Categorys=re_data['category']['cat_title']
-
Dates=re_data['date']
-
-
# 第二层的url
-
# 拿到第二层的连接需要继续解析
-
url2='https:' Ids
-
-
meta={'Titles':Titles,'Ids':Ids,'Categorys':Categorys,'Dates':Dates}
-
# 继续发出请求,回调函数中,去解析第二层需要的元素
-
yield scrapy.Request(url=url2,headers=self.headers,callback=self.parse_se,meta=meta)
-
-
-
-
def parse_se(self,response):
-
-
# 拿到第二层所需要的信息
-
Codes=response.css('.card pre>code::text').extract_first()
-
-
# 将第一层的信息,通过meta参数传递过来,再创建items封装,传到管道
-
Titles = response.meta['Titles']
-
Ids=response.meta['Ids']
-
Categorys = response.meta['Categorys']
-
Dates = response.meta['Dates']
-
-
ghdb=GhdbItem(Titles=Titles,Ids=Ids,Categorys=Categorys,Dates=Dates,Codes=Codes)
-
-
yield ghdb
三、进入管道保存信息
pipelines.py
先去settings文件中打开管道
1.存放在csv格式文件中
-
class SqUrlPipeline:
-
# 开始爬取自动调取的函数
-
def open_spider(self,spider):
-
# 数据去重下
-
self.id=set()
-
-
self.f=open('url_ip_jp.csv','a',encoding='utf-8')
-
-
-
def process_item(self, item, spider):
-
-
if item['name']in self.id:
-
raise DropItem(f"丢弃{item}")
-
else:
-
self.id.add(item['name'])
-
-
# item中的值取出来写入csv文件中,注意f''是为了转换成字符串不是对象
-
self.f.write(f"{item['urls']},{item['ips']}\n")
-
-
return item
-
# 结束时自动调取的函数
-
def close_spider(self,spider):
-
self.f.close()
2.存放在mysql数据库中
settings.py中添加
-
class JP_sqlPipeline:
-
def open_spider(self,spider):
-
# 导入from scrapy.utils.project import get_project_settings,从settings文件中取出值
-
settings=get_project_settings()
-
self.host=settings['POSTCODE_HOST']
-
self.port=settings['POSTCODE_PORT']
-
self.user=settings['POSTCODE_USER']
-
self.name=settings['POSTCODE_NAME']
-
self.charset=settings['POSTCODE_CHARSET']
-
self.password=settings['POSTCODE_PASSWORD']
-
# 开启管道自动调用连接数据库函数 连接数据库
-
self.connect()
-
def connect(self):
-
self.conn=pymysql.connect(
-
host=self.host,
-
port=self.port,
-
user=self.user,
-
database=self.name,
-
password=self.password
-
)
-
self.cur = self.conn.cursor()
-
-
def process_item(self, item, spider):
-
# 执行mysql语句
-
# 还必须写成.format格式化这个语法,写f“”语法总报错
-
# sql = """insert into jp_postcode(name,postcode)values("{}","{}")""".format(item['area'],item['codes'])
-
sql = 'insert into jp_postcode(name,postcode)values("{}","{}")'.format(item['area'], item['codes'])
-
self.cur.execute(sql)
-
self.conn.commit()
-
return item
-
def close_spider(self,spider):
-
self.cur.close()
-
self.conn.close()
四、设置开关,settings.py
1.先查看url是否正常进入parse解析器,如果进不去,找到
# ROBOTSTXT_OBEY = True 注释掉
2. spiders中有自定义cookies,需要打开
COOKIES_ENABLED = True 打开
3.管道需要打开
数字代表顺序
ITEM_PIPELINES = {
'SQ_URL.pipelines.SqUrlPipeline': 300,
}
4.文件log日志设置
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfhjhi
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01