# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html import pymysql import redis from spiders.items import TravelsItem, TravelsDetailItemclass Travels(object): @staticmethod def insert_db(item, pipeline_obj): sql = ''' INSERT travels(id,name,authorId,viewCount,likeCount, commentCount,publishTime,picUrl,authorName, authorHeadImg,authorIndentity,hasLike) VALUES('{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}') '''.format(item["id"], item["name"], item["authorId"], item["viewCount"], item["likeCount"], item["commentCount"], item["publishTime"], item["picUrl"], item["authorName"], item["authorHeadImg"], item["authorIndentity"], item["hasLike"]) pipeline_obj.mysql_conn.query(sql ) pipeline_obj.mysql_conn.commit() @staticmethod def insert_redis(item, pipeline_obj): detail_url = "http://www.tuniu.com/trips/" + str(item["id"]) pipeline_obj.redis_obj.rpush("tuniu:detail_urls", detail_url) class TravelsDetail(object): @staticmethod def insert_db(item, pipeline_obj): sql = ''' INSERT travels_detail(id,taglist,destination,price)VALUES('{}','{}','{}','{}') '''.format(item["id"], item["taglist"], item["destination"], item["price"]) pipeline_obj.mysql_conn.query(sql) pipeline_obj.mysql_conn.commit()class TuniutripsPipeline(object): def open_spider(self, spider): self.mysql_conn = pymysql.connect(host="localhost", port=3306, user="root", passwd="123456", db="test") pool = redis.ConnectionPool(host="127.0.0.1", password='') self.redis_obj = redis.Redis(connection_pool=pool) def process_item(self, item, spider): if isinstance(item, TravelsItem): Travels.insert_db(item, self) Travels.insert_redis(item, self) elif isinstance(item, TravelsDetailItem): TravelsDetail.insert_db(item, self) def close_spider(self, spider): self.mysql_conn.close()将每一行代码都做解释
时间: 2024-04-25 12:25:58 浏览: 158
这段代码是一个Scrapy爬虫的Pipeline,用于将爬取的数据存储到MySQL数据库和Redis缓存中。在这段代码中,定义了两个类Travels和TravelsDetail,分别用于插入旅游信息和旅游详情信息到MySQL数据库中。在TuniutripsPipeline类中,定义了三个方法:open_spider用于建立数据库连接和Redis连接;process_item用于处理爬取的数据,根据数据类型调用Travels或TravelsDetail的插入方法;close_spider用于关闭数据库连接。具体实现中,使用了pymysql和redis-py库进行数据库连接和操作。
相关问题
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html import pymysql import redis from spiders.items import TravelsItem, TravelsDetailItem将每一行代码都做解释
这段代码是一个Scrapy爬虫的Pipeline,用于将爬取的数据存储到MySQL数据库和Redis缓存中。在这段代码中,首先导入了pymysql和redis库,用于建立数据库连接和操作。然后从spiders.items中导入了TravelsItem和TravelsDetailItem,这两个类分别用于存储旅游信息和旅游详情信息。在具体实现中,需要根据数据类型调用不同的插入方法进行数据存储。
使用scrapy采集 广州链接花都区租房信息,起始地址https://gz.lianjia.com/zufang/huadou/pg1/#contentList ,要求获取最近发布的前9页的租房信息的标题,价格,及描述信息,并且存入MySQL数据库中
Scrapy是一个强大的网络爬虫框架,可以用于自动化抓取网站数据。要采集广州花都区租房信息并存储到MySQL数据库,你需要按照以下步骤操作:
1. **安装必要的库**:
- 安装Scrapy: `pip install scrapy`
- 需要MySQL驱动,如`pymysql`: `pip install pymysql`
2. **创建Scrapy项目**:
```sh
scrapy startproject huadou_rental
```
3. **创建Spider**:
在`huadou_rental/spiders`目录下创建一个新的Python文件,例如`huadou_spider.py`。编辑文件内容,导入必要的模块并设置起始URL:
```python
import scrapy
from huadou_rental.items import HuadouRentalItem
class HuadouSpider(scrapy.Spider):
name = 'huadou'
allowed_domains = ['gz.lianjia.com']
base_url = 'https://gz.lianjia.com/zufang/huadou/pg{}/#contentList'
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.start_urls = [self.base_url.format(page) for page in range(1, 10)]
# ... 爬取逻辑将在这里编写 ...
```
4. **定义Item**:
在`huadou_rental/items.py`中创建一个Item类,包含标题、价格和描述字段:
```python
import scrapy
class HuadouRentalItem(scrapy.Item):
title = scrapy.Field()
price = scrapy.Field()
description = scrapy.Field()
```
5. **编写爬取逻辑**:
在`HuadouSpider`中,实现解析HTML提取所需信息的函数,比如`parse()`。通常需要使用CSS选择器或XPath来定位元素。
```python
def parse(self, response):
rental_items = response.css('div.property-item') # 根据实际页面结构调整此选择器
for item in rental_items:
title = item.css('h3.title a::text').get() # 获取标题
price = item.css('.price span::text').get() # 获取价格
description = item.css('.des::text').get() # 获取描述
yield HuadouRentalItem(
title=title,
price=price,
description=description
)
```
6. **连接到数据库**:
在`settings.py`中配置数据库连接,添加`ITEM_PIPELINES`项:
```python
ITEM_PIPELINES = {
'mysql_pipelines.MySqlPipeline': 300,
}
MYSQL_PIPELINE settings (示例):
MYSQL_HOST = 'localhost'
MYSQL_USER = 'your_username'
MYSQL_PASSWORD = 'your_password'
MYSQL_DBNAME = 'rental_database'
MYSQL_TABLE_NAME = 'rental_data'
```
7. **编写数据库管道(MySqlPipeline)**:
创建`mysql_pipelines.py`,实现数据库插入功能:
```python
import pymysql
class MySqlPipeline(object):
def __init__(self, mysql_settings):
self.conn = pymysql.connect(**mysql_settings)
def process_item(self, item, spider):
with self.conn.cursor() as cursor:
sql = "INSERT INTO `%s` (title, price, description) VALUES (%s, %s, %s)" % (
mysql_settings['MYSQL_TABLE_NAME'],
pymysql.escape_string(item['title']),
pymysql.escape_string(item['price']),
pymysql.escape_string(item['description'])
)
try:
cursor.execute(sql)
self.conn.commit()
except Exception as e:
print(f"Error: {e}")
self.conn.rollback()
return item
def close_spider(self, spider):
self.conn.close()
```
8. **运行爬虫**:
在命令行中运行`scrapy crawl huadou`,爬虫会开始工作,获取数据并将结果存储到MySQL数据库。
阅读全文