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 ...
随机推荐
- HBase的Shell命令和JavaAPI
HBase的shell操作和JavaAPI的使用: Shell 表操作 创建表 create 'student','info' #表名 列族 插入表 put 'student','1001','inf ...
- JS静态变量和函数、实例变量和函数以及prototype 说明
静态变量.函数 当定义一个函数后通过 “.”为其添加的属性和函数,通过对象本身仍然可以访问得到,但是其实例却访问不到,这样的变量和函数分别被称为静态变量和静态函数,用过Java.C#的同学很好理解静态 ...
- hive lateral view 与 explode详解
ref:https://blog.csdn.net/bitcarmanlee/article/details/51926530 1.explode hive wiki对于expolde的解释如下: e ...
- springboot打包
springboot项目运行package命令,默认打出来的jar包只有几kb.想要打出可执行的jar包,加入插件: <build> <plugins> <plugin& ...
- IntelliJ Idea设置Could not autowire. No beans of 'xxx' type found
1.问题描述 在Idea的spring工程里,经常会遇到Could not autowire. No beans of ‘xxxx’ type found的错误提示.但程序的编译和运行都是没有问题的, ...
- linux环境下Mysql的卸载和重新安装和启动
MySql安装 1 安装包准备 1.查看mysql是否安装,如果安装了,卸载mysql (1)查看 [root@hadoop102 桌面]# rpm -qa|grep mysqlmysql-libs- ...
- 在linux环境下mongodb的安装和启动
安装 下载mongodb的版本,两点注意 根据业界规则,偶数为稳定版,如1.6.X,奇数为开发版,如1.7.X 32bit的mongodb最大只能存放2G的数据,64bit就没有限制 到官网,选择合适 ...
- FastDFS 配置 Nginx 模块,并实现分布式同步-Linux
1.搭建虚拟机 a.复制虚拟机文件 首先复制我们之前安装好的fastdfs虚拟机,因为我们现在要设置它的IP为21,改名为CentOS-fastdfs - 21. b.设置网络 生成新的MAC地址 设 ...
- 关于dumper和mysqldump的
最近在做版本更新 使用dumper在连接阿里云的RDS的时候 老是提示 需要超级管理员权限 无能只能使用系统自带的mysqldump了 语句简单方便 而且导出的表 没有加载库信息 mysqldump ...
- hive sql 语句执行顺序及执行计划
hive 语句执行顺序 from... where.... select...group by... having ... order by... 执行计划 Map Operator Tree: Ta ...