此次总结只是为了学习记录本人遇到的问题和知识的回顾,方便复习,无其他作用。
(1)开启redis服务 windows下的redis
redis-server redis.windows.conf
如果开启不成功 。。。报错
creating server tcp listening socket 127.0.0.1:6379: bind No error
需要以下执行
redis-cli.exe
shutdown
exit
redis-server.exe redis.windows.conf
(2) 用scrapy首先设置settings中的
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 2
#开启
ITEM_PIPELINES = {
'chinaTrafficNew.pipelines.ChinatrafficnewPipeline': 300,
}
(2)使用redis做缓存
#导库
from scrapy_redis.spiders import RedisCrawlSpider
在settings中配置
#使用了scrapy-redis里的去重组件,不使用scrapy默认的去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
#使用了scrapy-redis里的调度器组件,不使用scrapy默认的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
#本机IP
#REDIS_HOST = "192.168.137.1"
REDIS_HOST = '127.0.0.1'
#允许暂停,redis请求记录不丢失
SCHEDULER_PERSIST = True
#redis端口号
REDIS_PORT = 6379
#开启队列
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400,
}
(3)运行scrapy的脚本文件
from scrapy.cmdline import execute
execute(["scrapy", "crawl", "TrafficNew"])
(4)将请求放到redis中,和redis设置
start_url = []
start_url.append("http") #网址
r = redis.StrictRedis(host='127.0.0.1', port=6379)#redis的地址
r.delete('trafficNewSpider:start_urls')#
for url in start_url:
r.lpush('trafficNewSpider:start_urls', url)
result = r.smembers('redisspider:start_urls')
if result != 0:
print("加入start_url")
r.connection_pool.disconnect()
#设置
redis_key = "trafficNewSpider:start_urls"
(6)定时任务
from apscheduler.schedulers.background import BackgroundScheduler
sch = BackgroundScheduler()
sch.add_job(mysql) # 不加时间, 会在sch.start()后立即执行
sch.add_job(runAfter, 'interval', minutes=5) #每五分钟传一次页面
sch.start()
(7)得到data数据,url,和当前User-Agent
data = response.body.decode(response.encoding)
url = response.url
User-Agent = response.request.headers['User-Agent']
(8)提取信息
#xpath提取
titles = response.xpath('//title/text()').extract()
#正则提取
import re
pat = ''
re.compile(pat).findall(data)
#BeautifulSoup提取
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
paras = soup.select("div.center > div.article-main > p")
content = []
for para in paras:
if len(para) > 0:
content.append(para.get_text())
return "".join(content).strip()#组合成一个 并且去掉首尾空格
(9)知识点总结
分割
str = "作者:璃蝺"
str.split(":",1) #1代表分割成两个 不写1 代表分割成多个
strip()
split()详细用法_____菜鸟教程
strip()详细用法____菜鸟教程
(10) MYSQL的去重
设置主键