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 ...
随机推荐
- Java 3-Java 基本数据类型
Java 基本数据类型 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过定义不 ...
- python更新数据库脚本三种方法
最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 import MySQ ...
- android 开发 实现一个自定义布局的AlertDialog对话框
对话框有很多实现方法,最常见的是在一个点击事件中代码直接写出对话框.如下: package com.example.lenovo.mydemo2; import android.content.Dia ...
- tornado-模版reverse_url
from tornado.web import url handler=[ url(r"/hello", grab_handler.HelloHandler, name='hell ...
- Maintenance Planner calculate SPs by manual
note Are you unable to view your system or updated system information? Apply the latest version of t ...
- 浅谈测试驱动开发(TDD)
测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量.本文从开发人员使用的角度,介绍了 TDD 优势.原理.过程.原则.测试技术.Tips 等方面. ...
- python __class__属性
>>> class a(object): pass >>> o=a() >>> dir(o) ['__class__', '__delattr__ ...
- mybatis 3.2.2_环境搭建
1.创建一个工程 utf-8 2.导入jar mybatis-3.2.2.jar 核心包 依赖包: asm-3.3.1.jar cglib-2.2.2.jar commons-logging-1.1. ...
- PHP下进行XML操作(创建、读取)
PHP下可以使用DOMDocument类对XML或者HTML文件进行读写操作 更为简单的方法使用simpleXML类操作XML DOM节点分为 元素节点 属性节点 值节点 注释节点 根节点(docum ...
- Git安装和基本使用(1)
参考廖雪峰GIt教程 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137 ...