马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
请问大佬们,这个代码哪里错了import requests
import logging
import pymongo
import pymysql
index_url = 'https://spa1.scrape.center/api/movie/?limit=10&offset={}'
detail_url = 'https://spa1.scrape.center/api/movie/{}/'
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
}
logging.basicConfig(level=logging.INFO,format = '%(asctime)s - %(levelname)s: %(message)s')
#连接MySQL数据库
#初始化
conn = pymysql.Connect(
host='127.0.0.1',
port=3306,
user='root',
password='123456a'
)
cursor = conn.cursor()
#发起请求
def scrapy_api(index_url):
logging.info('正在爬取{}...'.format(index_url))
try:
response = requests.get(url=index_url,headers=header,verify=False)
if response.status_code == 200:
return response.json()
logging.error('爬取代码为{},爬取{}失败'.format(response.status_code,index_url))
except requests.RequestException:
logging.error('爬取{}失败'.format(index_url),exc_info=True)
#爬取列表页
def scrape_index(page):
page_url = index_url.format(10*(page-1))
return scrapy_api(page_url)
#拼接url并发起请求
def scrape_detail(id):
url = detail_url.format(id)
return scrapy_api(url)
#保存2:MySQL
def save_data(data):
sql = 'INSERT INTO movies(id,name,score) values (%s,%s,%s)'
try:
cursor.execute(sql, (data.get('id'),data.get('name'),data.get('score')))
conn.commit()
except:
conn.rollback()
conn.close()
def main():
for page in range(1,3):
index_data = scrape_index(page)
for item in index_data.get('results'):
id = item.get('id')
detail_data = scrape_detail(id)
logging.info('detail data {}'.format(detail_data))
save_data(detail_data)
logging.info('保存成功')
if __name__ == '__main__':
main()
您的代码中有一个明显的问题,就是在 save_data 函数中,您关闭了数据库连接。在您的代码中,这个函数会在每次爬取和保存电影详情信息时都被调用,所以在第一次调用后,数据库连接就会被关闭,之后的数据库操作都会失败。
如果您想要在所有的电影详情信息都爬取和保存后再关闭数据库连接,您可以把 conn.close() 这行代码移到 main 函数中,比如在所有循环结束后。
修改后的代码如下:
def save_data(data):
sql = 'INSERT INTO movies(id,name,score) values (%s,%s,%s)'
try:
cursor.execute(sql, (data.get('id'),data.get('name'),data.get('score')))
conn.commit()
except:
conn.rollback()
def main():
for page in range(1,3):
index_data = scrape_index(page)
for item in index_data.get('results'):
id = item.get('id')
detail_data = scrape_detail(id)
logging.info('detail data {}'.format(detail_data))
save_data(detail_data)
logging.info('保存成功')
conn.close()
if __name__ == '__main__':
main()
另外,有两个小问题可能也会引发错误。首先,我注意到您使用了 pymongo 模块,但是在这段代码中并没有实际用到它,因此,如果没有必要,您可以考虑删除这个导入。其次,您没有在连接到MySQL数据库时指定数据库的名称,这可能会导致在插入数据时出错。您可以在 pymysql.Connect 中添加一个 db='database_name' 的参数, database_name 是您要连接的数据库的名称。
|