先创建一个工程
scrapy startproject game
cd game
scrapy genspider demo 4399.com
编写items
import scrapy
class GameItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
name = scrapy.Field()
url = scrapy.Field()
编写spider
import scrapy
from game.items import GameItem
class DemoSpider(scrapy.Spider):
name = "demo"
allowed_domains = ["4399.com"]
start_urls = ['http://4399.com/']
def parse(self, response):
'''
name = 名字
img = 图标
url = 网址
'''
items = []
game_message = response.xpath('//ul[@class="tm_list"]/li')
for one in game_message:
item = GameItem()
item['name'] = one.xpath('a/img/@alt').extract()[0]
item['url'] = 'www.4399.com'+one.xpath('a/@href').extract()[0]
items.append(item)
return items
编写PIPELINE:
我们知道,pipelines.py是用来处理收尾爬虫抓到的数据的,
一般情况下,我们会将数据存到本地:
- 文本形式: 最基本的方式
- json格式 :方便其他程序员调用
- 数据库: 数据量多时
#文本
import os
import requests
import json
import codecs
import pymysql
class GamePipeline(object):
def process_item(self, item, spider):
处理每一个从SZtianqi传过来的item
fiename = 'F:/爬虫/data/game.txt'
# 从内存以追加的方式打开文件,并写入对应的数据
with open(fiename, 'a') as f:
f.write(item['name']+'\n')
f.write(item['url']+'\n')
return item
#json
class gjson(object):
def process_item(self, item, spider):
filename = 'F:/爬虫/data/game.json'
# 打开json文件,向里面以dumps的方式吸入数据
# 注意需要有一个参数ensure_ascii=False ,不然数据会直接为utf编码的方式存入比如:“/xe15”
with codecs.open(filename, 'a') as f:
line = json.dumps(dict(item), ensure_ascii=False) + '\n'
f.write(line)
return item
#数据库
class gmysql(object):
def process_item(self, item, spider):
'''
将爬取的信息保存到mysql
'''
# 将item里的数据拿出来
name = item['name']
url = item['url']
# 和本地的scrapyDB数据库建立连接
connection = pymysql.connect(
host='localhost', # 连接的是本地数据库
user='root', # 自己的mysql用户名
passwd='000323624', # 自己的密码
db='scrapyDB', # 数据库的名字
charset='utf8mb4', # 默认的编码方式:
cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
# 创建更新值的sql语句
sql = """INSERT INTO game(name,url)
VALUES (%s, %s)"""
# 执行sql语句
# excute 的第二个参数可以将sql缺省语句补全,一般以元组的格式
cursor.execute(
sql, (name,url))
# 提交本次插入的记录
connection.commit()
finally:
# 关闭连接
connection.close()
return item['name
编写Settings.py
#数字是优先级
ITEM_PIPELINES = {
'game.pipelines.gmysql': 300,
'game.pipelines.GamePipeline': 500,
'game.pipelines.gjson': 400
}
注意事项
注意
item[‘name’] = one.xpath(‘a/img/@alt’).extract()[0]
extract转化为列表 [0]获得第一个元素str