scrapy 常用代码
一,scrapy请求
yield scrapy.Request(url=url, dont_filter=True, callback=self.page, meta={'item': copy.deepcopy(item)})
yield scrapy.FormRequest(url=self.url, headers=self.unicornHeader, method='POST', formdata=self.FormData, meta=self.customerData, callback=self.after_post, errback=self.error_handle, dont_filter=True)
item = response.meta['item']
二,xpath提取数据
response.xpath('//*[@id="__EVENTVALIDATION"]/@value').extract_first().strip()
response.xpath('//div[@class="mt20 articl-know"][1]/p[4]/span[2]/text()').extract_first().strip()
三,scarpy 判断
if isinstance(item, ArticleViewsCountItem):
if 'food_id' in item.keys():
四,scrapy 登入
start_urls = ['http://renren.com/'] def parse(self, response):
data = {
'email': '111',
'password': 'sssws'
}
print('login.....')
yield scrapy.FormRequest.from_response(response,
formdata=data,
callback=self.next,
)
五.scrapy 启动
scrapy crawl spiderName
scrapy crawl spiderName -s LOG_FILE=spider.log # 指定日志输出文件
六.设置代理
1.middlewares.py
meta={'item': copy.deepcopy(item), 'proxy': "10.133.3.26:1080"} # 设置单个请求代理 是spider.py中
import requests
class MyproxiesSpiderMiddleware(object):
def process_request(self, request, spider):
proxies = requests.get('http://127.0.0.1:5000/get').content.decode('utf-8')
print(proxies)
request.meta["proxy"] = "http://{}".format(proxies)
# request.meta["proxy"] = "http://36.249.49.43:9999"
import logging
import random
import redis
from steam_users.settings import REDIS_HOST, REDIS_POST, REDIS_DATABASE, REDIS_PASSWORD
logger = logging.getLogger(__name__)
class ProxyDownloadMiddleware(object):
def __init__(self):
self.conn = redis.Redis(host=REDIS_HOST, port=REDIS_POST, password=REDIS_PASSWORD, db=REDIS_DATABASE)
def queue_len(self):
# 获取队列长度
return self.conn.llen("proxies")
def get_redis(self):
# 随机获取redis中的一个ip
num = random.randint(1, self.queue_len()) - 1
return self.conn.lindex('proxies', num).decode('utf-8')
def process_request(self, request, spider):
if request.url.startswith("http://"):
request.meta['proxy'] = "http://{proxy_ip}".format(proxy_ip=self.get_redis())
elif request.url.startswith("https://") and not request.url.startswith('https://steamcommunity'):
print('ff')
request.meta['proxy'] = "https://{proxy_ip}".format(proxy_ip=self.get_redis())
print("using proxy: {}".format(request.meta['proxy']))
# # 使用私密代理或独享代理需要将用户名和密码进行base64编码,然后赋值给request.headers["Proxy-Authorization"]
# # 如果是开放代理就不需要以下步骤,直接设置代理IP即可
# user_password = "{username}:{password}".format(username='username', password='password')
# b64_user_password = base64.b64encode(user_password.encode("utf-8"))
# request.headers["Proxy-Authorization"] = "Basic " + b64_user_password.decode("utf-8")
return None
2..setting中开启代理中间件
DOWNLOADER_MIDDLEWARES = {
'jxy.middlewares.MyproxiesSpiderMiddleware': 543,
}
七.数据入库
import pymysql class MogujiePipeline(object):
def __init__(self):
# 创建数据库连接
self.db = pymysql.connect(host='localhost', port=3306, database='cfda', user='root', password='root',
charset='utf8')
# self.db = pymysql.connect(host='115.238.111.198', port=3306, database='spider_yu', user='spider',
# password='Kangce@0608',
# charset='utf8')
self.cursor = self.db.cursor() def process_item(self, item, spider):
# 判断爬取的字段数据库中是否已经存在
num = self.cursor.execute('select id from jiankangshuju_food where url="{}"'.format(item["url"]))
if not num:
list_key = []
list_lalues = []
for key, lalues in item.items():
list_key.append(key)
list_lalues.append("'" + str(lalues).replace("'", "‘") + "'")
# 拼接sql语句
insert_sql = "insert into jiankangshuju_food({}) values({})".format(', '.join(list_key),
', '.join(list_lalues))
try:
self.cursor.execute(insert_sql)
self.db.commit()
except:
print('insert_sql:', insert_sql) # 查询数据
self.cursor.execute("select * from catalogue")
data = self.cursor.fetchone()
data = self.cursor.fetchall() # 更新数据
self.cursor.execute("update catalogue set ''='{}', ''='{}' where id={}".format())
self.db.commit() # 删除数据
self.cursor.execute("delete from catalogue where id={}".format())
self.db.commit() return item def close_spider(self, spider):
# 关闭数据库的连接
self.cursor.close()
self.db.close()
八.def start_requests(self)
# get请求
def start_requests(self):
db = pymysql.connect(host='localhost', port=3306, database='game', user='root', password='root',
charset='utf8', autocommit=True)
cursor = db.cursor()
cursor.execute('select id, appid, last_modified from steam_appid where id =1085660')
for appid in cursor.fetchall():
item = {}
item['appid'] = appid[1]
item['last_modified'] = appid[2]
yield scrapy.Request(url='https://store.steampowered.com/app/{}/'.format(appid[1]),
meta={'item': copy.deepcopy(item)}) # post request payload
yield scrapy.Request(url='https://www.wegame.com.cn/api/rail/web/data_filter/game_info/by_game_id',
meta={'item': copy.deepcopy(item)},
headers={'Content-Type': 'application/json;charset=UTF-8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36',
},
body=json.dumps({"game_ids": ["{}".format(str(appid[1]))],
"filters": [],
"stamp": {"agent_client_language": "zh_CN"},
"response_format": 0}, ensure_ascii=False),
dont_filter=True,
method='POST')
九,数据库配置
# ---------服务器mysql配置----------
# MYSQL_HOST = '192.168.107.229'
# MYSQL_POST = 3306
# MYSQL_DATABASE = 'spider_app'
# MYSQL_PASSWORD = '123456'
# MYSQL_USER = 'root' # -------------本地mysql配置--------------
MYSQL_HOST = '10.133.3.26'
MYSQL_POST = 3306
MYSQL_DATABASE = 'spider_app'
MYSQL_PASSWORD = 'root'
MYSQL_USER = 'root' from steam_users.settings import MYSQL_HOST, MYSQL_POST, MYSQL_DATABASE, MYSQL_PASSWORD, MYSQL_USER pymysql.connect(host=MYSQL_HOST, port=MYSQL_POST, database=MYSQL_DATABASE, user=MYSQL_USER,
password=MYSQL_PASSWORD,
charset='utf8', autocommit=True)
scrapy 常用代码的更多相关文章
- 【转载】GitHub 标星 1.2w+,超全 Python 常用代码合集,值得收藏!
本文转自逆袭的二胖,作者二胖 今天给大家介绍一个由一个国外小哥用好几年时间维护的 Python 代码合集.简单来说就是,这个程序员小哥在几年前开始保存自己写过的 Python 代码,同时把一些自己比较 ...
- GCD 常用代码
GCD 常用代码 体验代码 异步执行任务 - (void)gcdDemo1 { // 1. 全局队列 dispatch_queue_t q = dispatch_get_global_queue(0, ...
- 转--Android实用的代码片段 常用代码总结
这篇文章主要介绍了Android实用的代码片段 常用代码总结,需要的朋友可以参考下 1:查看是否有存储卡插入 复制代码 代码如下: String status=Environment.getE ...
- 刀哥多线程之03GCD 常用代码
GCD 常用代码 体验代码 异步执行任务 - (void)gcdDemo1 { // 1. 全局队列 dispatch_queue_t q = dispatch_get_global_queue(0, ...
- jquery常用代码集锦
1. 如何修改jquery默认编码(例如默认GB2312改成 UTF-8 ) 1 2 3 4 5 $.ajaxSetup({ ajaxSettings : { contentT ...
- Mysql:常用代码
C/S: Client Server B/S: Brower Server Php主要实现B/S .net IIS Jave TomCat LAMP:L Mysql:常用代码 Create table ...
- javascript常用代码大全
http://caibaojian.com/288.html 原文链接 jquery选中radio //如果之前有选中的,则把选中radio取消掉 $("#tj_cat .pro_ca ...
- Android 常用代码大集合 [转]
[Android]调用字符串资源的几种方法 字符串资源的定义 文件路径:res/values/strings.xml 字符串资源定义示例: <?xml version="1.0&q ...
- NSIS常用代码整理
原文 NSIS常用代码整理 这是一些常用的NSIS代码,少轻狂特意整理出来,方便大家随时查看使用.不定期更新哦~~~ 1 ;获取操作系统盘符 2 ReadEnvStr $R0 SYSTEMDRIVE ...
随机推荐
- Linux RPS/RFS 实现原理浅析
本文快速解析一下RPS/RFS的基本原理. RPS-Receive Packet Steering 下面这个就是RPS的原理: 其实就是一个软件对CPU负载重分发的机制.其使能的作用点在CPU开始处 ...
- Fragment与Radiogroup联动,经典的主界面布局。使用show和hide的方式实现;
Fragment+RadioGroup经典的主界面布局,方便实用: 1.使用replace方式: 直接上代码,先是布局文件: <?xml version="1.0" enco ...
- json.loads()的字符串中为单引号引发的错误
如下错误属于弱智错误,但是错的原因让我无语,所以记录一下 str2="{'card':6217001650004184441}"print(json.loads(str2)) Tr ...
- 在html中使用thymeleaf编写通用模块
在编写页面时,常常会需要用到通用模块,比如header部分.footer部分等. 项目前端使用的是themeleaf模板引擎,下面简单介绍下使用themeleaf写header通用模块: 1. 通用部 ...
- JAVA面试精选【Java web部分一】
Java的基础知识点就太多了,要说也不能穷尽,这个主要是靠自己在平时的积累和项目的开发经验,外边考的多的一般是继承,多态,线程,集合等等,但是笔试或者是面试中很有可能问许多集体的内容,比如hashMa ...
- Java swing 代码例子
package com; import java.awt.Button; import java.awt.Container; import java.awt.event.ActionEvent; i ...
- HBase中无法使用backspace删除
转载自:Hbase命令行无法删除的问题 在HBase的shell命令行界面输入错误项按"退格键"删除,却怎么也删除不了: 解决办法: 第一步,修改SecureCRT的设置参数: 第 ...
- 笔记:pycharm 快捷键
[重要]pyCharm的编码一个坑: 2017-10-18 在使用pyCharm4.5,调用库bs4爬取页面时,有报错如下: UnicodeEncodeError: 'gbk' codec can't ...
- 使用uni-app开发微信小程序之登录模块
从微信小程序官方发布的公告中我们可获知:小程序体验版.开发版调用 wx.getUserInfo 接口,将无法弹出授权询问框,默认调用失败,需使用 <button open-type=" ...
- FLEX中一组基于button的组件
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...