python scrapy爬虫 连数据库 self.conn.commit的作用
时间: 2024-03-29 21:36:46 浏览: 224
在 Scrapy 爬虫中,通常需要将爬取到的数据存储到数据库中。在使用数据库存储数据的时候,需要创建数据库连接并获取游标对象。在执行数据库的插入、删除、更新等操作时,需要调用 `commit()` 方法将操作提交到数据库中。这样,在数据库中才能看到插入、删除或更新后的数据变化。
在 Scrapy 爬虫中,通常会在 `spider_opened` 方法中创建数据库连接。在爬虫运行过程中,当爬虫爬取到数据并需要存储到数据库中时,需要调用游标对象的 `execute()` 方法执行插入、删除、更新等操作。在执行完所有的数据库操作之后,需要调用数据库连接对象的 `commit()` 方法将所有的操作提交到数据库中。
所以,在 Scrapy 爬虫中,`self.conn.commit()` 的作用是将之前的所有数据库操作提交到数据库中,使得数据在数据库中得到更新。
相关问题
现在有settings配置参数: DB_HOST='192.168.231.128' DB_PORT=3306 DB_USER='root' DB_PASSWORD='1234' DB_NAME='test' DB_CHARSET='utf-8' 和管道配置文件: from1 scrapy.utils.projectt importt get_project_settings import pymysql class MysqlPipeline(object): #init_方法和open_spider的作用是一样的 #init是获取settings中的连接参数 definit_(self): settings=get_project_settings() self.hostt = settings['DB_HOST'] self.port=settings['DB_PORT'] self.user = settings['DB_USER'] self.pwd = ssettings['DB_PWD'] self.namee = settings['DB_NAME'] self.charset = settings['DB_CHARSET'] self.connect() #连接数据库并且获取cursor对象 def connect(self): self.conn = pymysql.connect(host=self.host, port=self.port, user=self.user, password=self.pwd, db=self.name, password=self.pwd, db=self.name, charset=self.charset) self.cursor = self.conn.cursor() def process_item(self, item, spider): sql = 'insert into book(image_url, book_name, author, info) values("%s", "%s", "%s", "%s")′ % (item['image_url'], item['book_name'], item['author'], item['infd sql = 'insert into book(image_url,book_name,author,info) values ("{}","{}","{}","{}")'.format(item['image_url'], item['book_name'], item['author'], item['info']) # 执行sql语句 self.cursor.execute(sql) self.conn.commit() return item def close_spider(self, spider): self.conn.close() self.cursor.close() 请根据以上两个文件运用python代码编写爬虫代码爬取"https://www.pythontab.com/html/pythonjichu/"网站的文章标题,作者,存入一个csv文件中。
<think>好的,我现在需要帮用户解决一个关于Scrapy爬虫的问题。用户提供了他们的settings配置和管道文件,但看起来可能存在一些错误,需要先检查。他们的目标是用Python编写爬虫代码,从指定网站爬取文章标题和作者,并存入CSV文件,但提供的管道是用于MySQL的,可能需要调整。
首先,用户的需求是存入CSV,但提供的管道是处理MySQL的。这可能意味着用户可能混淆了两种存储方式,或者希望同时存储到数据库和CSV?但根据问题描述,用户明确要求存入CSV,所以可能需要忽略MySQL管道,转而使用Scrapy自带的Feed Export功能来生成CSV,或者自定义CSV导出管道。
不过,用户提供的管道文件存在一些明显的语法错误,比如拼写错误:from1 scrapy.utils.projectt importt get_project_settings,这里应该是from scrapy.utils.project import get_project_settings,还有import pymysql是正确的,但后续代码中的变量名可能也有错误,比如ssettings['DB_PWD']应该是settings['DB_PASSWORD'],因为用户提供的配置中密码是DB_PASSWORD='1234',而管道中使用了self.pwd = ssettings['DB_PWD'],这里变量名不匹配,应该是DB_PASSWORD。
不过,用户现在的问题是需要将数据存入CSV,而不是MySQL。所以可能需要忽略现有的MysqlPipeline,或者用户可能希望同时存储到MySQL和CSV?但问题描述中只提到存入CSV,所以可能需要重新编写一个处理CSV的管道,或者调整设置使用Scrapy内置的CSV导出。
但用户可能已经有一个MysqlPipeline,但需要改为CSV存储,或者可能用户提供的管道文件有误,需要修正。但根据问题,用户可能希望利用现有的配置,但改为存储到CSV。可能需要明确告诉用户如何调整代码。
接下来,我需要考虑Scrapy项目的结构。通常,Scrapy项目包括spider文件、items.py、pipelines.py、settings.py等。用户已经提供了settings的配置参数和管道文件,但可能存在错误,需要修正。
首先,用户提供的管道代码有几个问题:
1. 导入语句错误:from1和importt有拼写错误,应该是from和import。
2. 类MysqlPipeline中的__init__方法写成definit_,应该改为def __init__(self)。
3. 在获取settings参数时,可能存在变量名错误,比如DB_PWD在settings中实际是DB_PASSWORD,所以self.pwd = settings['DB_PWD']会导致KeyError,应该改为settings['DB_PASSWORD']。
4. 在连接数据库时,重复了password和db参数,可能引起错误。
5. process_item中的SQL语句拼接有问题,使用了字符串格式化,可能存在SQL注入风险,应改用参数化查询。但用户现在需要的是存储到CSV,所以这部分可能需要忽略。
由于用户的目标是存入CSV文件,可能需要使用Scrapy的Feed Exports,或者在管道中编写CSV存储的逻辑。这里可能需要创建一个新的Pipeline来处理CSV,或者调整现有的MysqlPipeline,但更合理的是使用Scrapy自带的CSV导出功能。
步骤可能如下:
1. 创建Scrapy项目,配置settings.py文件,启用CSV导出和必要的管道。
2. 定义Item类,包含title和author字段。
3. 编写Spider,解析网页提取标题和作者。
4. 配置FEED_URI指向CSV文件,并设置FEED_FORMAT为csv。
但用户可能希望用自定义的管道来写入CSV,所以需要编写一个CSVPipeline。或者,直接使用Scrapy的feed exports会更简单。
但根据用户提供的管道文件,他们可能希望将数据存入MySQL,但问题描述却要求存入CSV。这里可能存在混淆,需要澄清。但根据用户的问题,现在需要的是生成爬虫代码,存入CSV,所以可能应该忽略MySQL管道,或者指出用户的需求矛盾,并给出两种解决方案。
不过,用户可能只是误将MySQL管道包含进来,实际需要的是CSV存储。因此,正确的做法是指导用户如何编写爬虫,并配置CSV导出,而不使用MySQL管道。
现在,用户提供的settings配置参数包括数据库连接信息,但如果不需要存储到数据库,这些可能不需要。但用户可能希望同时存储到数据库和CSV?但问题描述中只提到存入CSV,所以可能只需要关注CSV部分。
总结步骤:
1. 创建Scrapy项目结构。
2. 在items.py中定义字段。
3. 编写Spider解析页面,提取标题和作者。
4. 配置settings.py启用CSV Feed Export。
5. 运行爬虫并导出到CSV。
可能用户提供的管道文件存在错误,但问题可能不需要使用它,因为目标是CSV。因此,可能需要忽略MysqlPipeline,并直接使用Feed Export。
现在,检查目标网站的结构。访问https://www.pythontab.com/html/pythonjichu/,假设该网站有一个文章列表,每个条目包含标题和作者。需要分析页面结构,确定选择器。
例如,可能每个文章条目在某个HTML元素中,比如<div class="article-list">下的各个条目,标题可能在<h2>标签内,作者可能在某个<span class="author">里。需要具体的XPath或CSS选择器来提取这些数据。
假设页面结构如下:
<div class="article">
<h2><a href="...">标题</a></h2>
<span class="author">作者名</span>
</div>
那么,Spider中需要编写相应的解析逻辑。
接下来,编写Scrapy Spider:
1. 定义start_urls为提供的URL。
2. 在parse方法中提取文章条目,然后提取标题和作者。
3. 将数据封装到Item中。
然后,配置settings.py启用Feed Export,设置FEED_FORMAT为csv,FEED_URI为文件名,如'articles.csv'。
但用户可能需要自定义CSV的导出方式,比如指定字段顺序,可以使用FEED_EXPORT_FIELDS设置。
现在,处理用户提供的管道文件中的错误,如果用户确实需要同时存储到MySQL和CSV,则需要修正管道代码,并添加CSV处理管道。但根据问题描述,用户只需要存入CSV,所以可能不需要MySQL部分,但用户可能误将MySQL配置包含进来。需要明确回答如何根据现有配置编写爬虫存入CSV,但现有配置中的管道是用于MySQL的,这可能是一个矛盾。
可能的解决方案:
- 指出用户的需求是存入CSV,因此不需要使用提供的MysqlPipeline,而是使用Scrapy内置的Feed Export功能,并提供相应的配置。
- 修正用户提供的管道文件中的错误,但根据问题,用户可能需要的是CSV存储,因此可能应忽略MySQL部分。
因此,回答应该指导用户如何编写爬虫,使用正确的配置,并将数据导出到CSV,而不使用MySQL管道。需要检查用户提供的代码中的错误,但问题可能与MySQL无关。
现在,编写具体的步骤:
1. 创建Scrapy项目:
scrapy startproject pythontab_spider
2. 在items.py中定义字段:
import scrapy
class ArticleItem(scrapy.Item):
title = scrapy.Field()
author = scrapy.Field()
3. 编写Spider:
import scrapy
from ..items import ArticleItem
class PythonJichuSpider(scrapy.Spider):
name = 'python_jichu'
start_urls = ['https://www.pythontab.com/html/pythonjichu//']
def parse(self, response):
articles = response.css('div.article') # 根据实际HTML结构调整选择器
for article in articles:
item = ArticleItem()
item['title'] = article.css('h2 a::text').get()
item['author'] = article.css('span.author::text').get()
yield item
4. 配置settings.py:
启用Feed Export:
FEED_FORMAT = 'csv'
FEED_URI = 'articles.csv'
同时,确保ROBOTSTXT_OBEY = False(如果需要),并设置USER_AGENT。
5. 运行爬虫:
scrapy crawl python_jichu
这将生成articles.csv文件,包含标题和作者。
但需要验证目标网站的实际HTML结构,可能需要调整选择器。例如,如果文章列表在某个特定的类或标签下,比如<div class="list-item">,则需要相应地修改选择器。
另外,用户提供的管道文件存在多个错误,比如:
- from1和importt拼写错误。
- __init__方法定义错误。
- 变量名错误,如ssettings,DB_PWD应为DB_PASSWORD。
- 重复的password和db参数。
- SQL语句中的字符串格式化错误,以及字段名错误(如infd)。
如果用户确实需要同时存储到MySQL和CSV,则需要修正这些错误,并在settings中启用两个管道。但根据问题描述,用户的需求是存入CSV,因此可能应忽略MySQL部分,专注于CSV导出。
总结:用户需要的是编写一个Scrapy爬虫,正确解析目标页面,提取标题和作者,并导出到CSV。需要指导用户如何设置Feed Export,并编写正确的Spider代码。</think>根据需求,我们将分步骤实现爬虫代码:
### 第一步:创建Scrapy项目结构
```bash
scrapy startproject pythontab
cd pythontab
```
### 第二步:定义Item(items.py)
```python
import scrapy
class PythontabItem(scrapy.Item):
title = scrapy.Field()
author = scrapy.Field()
```
### 第三步:创建爬虫文件(spiders/pythontab_spider.py)
```python
import scrapy
from pythontab.items import PythontabItem
class PythonJichuSpider(scrapy.Spider):
name = 'python_jichu'
allowed_domains = ['www.pythontab.com']
start_urls = ['https://www.pythontab.com/html/pythonjichu//']
def parse(self, response):
# 根据实际页面结构调整选择器
for article in response.css('div.article-list-item'):
item = PythontabItem()
item['title'] = article.css('h2::text').get().strip()
item['author'] = article.css('.author::text').get().strip()
yield item
```
### 第四步:配置CSV导出(settings.py)
```python
FEED_FORMAT = "csv"
FEED_URI = "output.csv"
FEED_EXPORT_ENCODING = 'utf-8-sig' # 支持中文
FEED_EXPORT_FIELDS = ["title", "author"] # 字段顺序
```
### 第五步:运行爬虫
```bash
scrapy crawl python_jichu
```
### 注意要点:
1. 实际选择器需要根据目标网站的HTML结构进行调整,建议使用浏览器开发者工具分析DOM结构
2. 如果遇到反爬机制,需要在settings.py中添加:
```python
DOWNLOAD_DELAY = 2
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
```
### 原配置问题修正:
1. 管道文件中的拼写错误:
```python
# 原错误行
from1 scrapy.utils.projectt importt get_project_settings
# 应改为
from scrapy.utils.project import get_project_settings
```
2. 变量名修正:
```python
# 原错误配置
self.pwd = ssettings['DB_PWD']
# 应改为
self.password = settings['DB_PASSWORD']
```
scrapy爬虫的案例
### Scrapy 爬虫 示例项目教程
#### 创建Scrapy项目
为了启动一个新的Scrapy项目,在命令行中进入想要保存项目的文件夹位置,然后运行`scrapy startproject project_name`命令来创建新的Scrapy项目[^3]。
```bash
scrapy startproject douban_movie_top250
```
此命令会生成一个名为`douban_movie_top250`的新目录,其中包含了基本的Scrapy项目结构。
#### 明确目标——定义所需抽取的数据项(Item)
在开始编写爬虫之前,先确定希望从网页上抓取哪些信息。对于豆瓣电影Top250的例子来说,可能感兴趣的信息有电影排名、名称、简介、评分等级以及评论数量等。这些字段可以在items.py文件里被定义成Item类的一部分。
#### 制作爬虫——编写Spider脚本来抓取网站并提取所有Item对象
一旦明确了要收集的具体数据点之后,就可以着手构建具体的Spiders了。通过执行如下指令可快速建立一个基础模板:
```bash
cd douban_movie_top250
scrapy genspider top250 movie.douban.com/top250
```
这将在spiders子目录下自动生成一个叫做top250.py的Python模块作为起点。在这个文件内部,可以根据实际需求调整start_urls列表中的URL地址,并利用XPath表达式定位页面上的各个元素节点以完成数据采集工作。
#### 存储内容——编写Pipeline处理已提取出来的Item对象
最后一步就是决定如何处置已经获得的结果集。通常情况下可以选择将其导出至JSON文件、CSV表格或是直接存入关系型数据库如MySQL当中去。为此需要编辑pipelines.py文档内的相应函数逻辑实现上述功能。
```python
import pymysql
class DoubanMovieTop250Pipeline(object):
def __init__(self):
self.conn = pymysql.connect(host='localhost', user='root', passwd='', db='test')
self.cursor = self.conn.cursor()
def process_item(self, item, spider):
sql = "INSERT INTO movies (rank, title, rating) VALUES (%s,%s,%s)"
val = (item['ranking'], item['title'], item['rating'])
try:
self.cursor.execute(sql,val)
self.conn.commit()
except Exception as e:
print(e)
self.conn.rollback()
return item
def close_spider(self, spider):
self.conn.close()
```
以上代码片段展示了怎样把抓取到的内容写入本地MySQL服务器里的movies表内。
阅读全文
相关推荐
















