python打包scrapy项目《打包结果是一个可移植的文件夹》
这是打包后的文件结构,打包前只有Fund文件夹+hooks文件夹+scrapy.cfg+start.py
第一步:
start.py文件 是打包的入口(项目完成前并没有它,只为打包而生)
#coding = utf-8
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
-- coding: utf-8 --
import scrapy
import json
from Fund.items import FundItem #入口把你的爬虫主要代码都带过来了Fund文件夹下items.py中的一个类FundItem;
from scrapy.http.response.html import HtmlResponse as HtmlResponse
from scrapy.http.request import Request
#解决方案–官网 \Fund\spiders\fund_spider.py 爬虫主py的代码全部放在这里【只保留部分代码参考】
class FundSpider(scrapy.Spider):
name = ‘fund’ #爬虫名称
headers = { # 请求头
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36",
}
max_page = 7 # 需要爬取的页数
temp_page = 0 # 爬取第x页
base_url2 ='hd/' # 具体信息页的链接前半段
urls = [f'htt)] # 列表页 url
def start_requests(self):
'''
爬虫发起的第一个请求
'''
yield scrapy.Request(
self.urls[0],
#callback=self.parse, #这条我注释掉了,因为执行报错OSError: could not get source code【后面还有一处,修改了删除,因这个报错,第一处】
dont_filter=True
#verify=False
)
def parse(self,response):
response = json.loads(response.body_as_unicode())
for num in range(100):
url2 = self.base_url2 + response.get('content')[num].get('url')
yield scrapy.Request(url2,callback=self.info_parse) #,verify=False) # 发起 request 请求,并进入回调函数
self.temp_page += 1 # 爬取第 x 页
if self.temp_page < self.max_page:
yield scrapy.Request(
self.urls[self.temp_page],
method="POST",
headers=self.headers,
body="{}",
#callback=self.parse, #这条我注释掉了,因为执行报错OSError: could not get source code【后面还有一处,修改了删除,因这个报错,第二处】
dont_filter=True
#verify=False # 防止 scrapy 对该 url 去重
)
def info_parse(self,response):
item = FundItem()
#print(response.text)
#hxs = Selector(response) # 实例化一个 item
for val in range(15):
title = response.xpath('//div[1][@class="table-response"]/table/tbody/tr[{}]/td[1]/text()'.format(val)).extract_first()
else:
pass
#yield item #这条我注释掉了,因为执行报错OSError: could not get source code【后面还有一处,修改了删除,因这个报错,第三处】
return item
#创建一个进程
process = CrawlerProcess(get_project_settings())
‘followall’ is the name of one of the spiders of the project.
process.crawl(FundSpider) #避开命令行
process.start()
入口py文件编辑好后,就直接打包,会生成start.spec文件;
第二不
构建hooks文件,系统性的导入文件。这里分为两步,第一步,构建scrapy-hook.py文件;第二步,构建start.spec文件。
#coding=utf-8
#调用hooks,批量导入数据与模块
from PyInstaller.utils.hooks import collect_submodules, collect_data_files
This collects all dynamically imported scrapy modules and data files.
hiddenimports = (collect_submodules(‘scrapy’) +
collect_submodules(‘scrapy.pipelines’) +
collect_submodules(‘scrapy.extensions’) +
collect_submodules(‘scrapy.utils’)+collect_submodules(‘scrapy.spiders’)
)
#加载数据
datas = collect_data_files(‘scrapy’)
这个是保存在hooks下的scrapy-hook.py文件
第三部修改
start.spec 文件
-- mode: python ; coding: utf-8 --
block_cipher = None
a = Analysis([‘start.py’],
pathex=[‘D:\打包专用目录\cs99’], #你打包文件的位置
binaries=[],
datas=[(".\scrapy.cfg",".")],
hiddenimports=[“Fund.items”,“Fund.middlewares”,‘Fund.pipelines’,‘Fund.settings’,‘Fund.spiders’], #我的Fund文件下的几个py文件
hookspath=[".\hooks\"], #引入文件
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name=‘start’,
debug=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name=‘start’)
最后直接执行 pyinstaller -F start.spec (当前位置启动cmd哦)