python打包scrapy项目《打包结果是一个可移植的文件夹》

这是打包后的文件结构,打包前只有Fund文件夹+hooks文件夹+scrapy.cfg+start.py

第一步:

start.py文件 是打包的入口(项目完成前并没有它,只为打包而生)

python zip打包目录 python打包文件夹_ci


#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哦)