声明:本文中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

本次,我们将采用同样的方式爬取某东上的商品评论,并把打包的完整过程以图片形式呈现在下方。我们仍然按照上一篇文章的逻辑来叙述整个流程。

1. 获取 cookies
from DrissionPage import ChromiumPage
import time
import pickle
 
# 需要传入的参数
platform_url = 'https://www.jd.com/'
file_path = "cookies.pkl"
# 具体代码的执行
page = ChromiumPage()
page.get(platform_url)
time.sleep(120)
cookies = page.cookies()
with open(file_path, "wb") as cookies_file:
    pickle.dump(cookies, cookies_file)

我指出,按照上述格式编写代码,会有利于将它封装成函数,因为我们将需要传入的参数和利用这些参数执行的具体操作分开了,于是上面的代码封装后就得到

from DrissionPage import ChromiumPage
import time
import pickle
 
def get_cookies(platform_url, file_path):
    page = ChromiumPage()
    page.get(platform_url)
    time.sleep(120)
    cookies = page.cookies()
    with open(file_path, "wb") as cookies_file:
        pickle.dump(cookies, cookies_file)
# 测试函数功能
if __name__ == '__main__':
    platform_url = 'https://www.jd.com/'
    file_path = "cookies.pkl"
    get_cookies(platform_url, file_path)

下面我将采取同样的方式编写代码。

2. 携带 cookies 进行爬虫

由于某东等大型网站往往都会有强大的反爬机制,所以我们每次在爬虫的时候都要考虑爬取内容是否太多、爬取速度是否太快等因素,以免对服务器造成太大的压力。所以我们采用一种新的方式进行爬虫。

首先,打开某东首页,在搜索框中随便输入一种商品名称,会有很多搜索结果。

然后,我们将这些搜索结果的链接全部提取出来,放在一个文件中 (我们暂且记这个文件为 links.txt)。

最后,我们遍历这个文件中的所有链接,逐个提取所需的内容,提取完一个商品链接中的内容之后,将所得内容写入文件中。再暂停一段时间,避免对服务器造成太大压力。

看到这里,你是否觉得这个过程似曾相识?其实,爬虫的本质就是模拟人类上网的一段代码。所以可以明确的是,我们操纵的对象是一个 “人”,这个“人” 可以帮助我们完成上述操作,前提是它得有 cookies 和要抓取的网页链接(链接通常是固定的,因为对于不同的网页,爬虫代码一般都会不一样)。于是,我们可以编写一个类叫做 Agent,通过调用 Agent 类的上述两种方法就可以实现爬虫代码了。下方是一个 Agent 类的简化版示例:

class Agent:
    def __init__(self, cookies):
        self.cookies = cookies
        self.platform_url = 'https://www.jd.com/'
 
    def get_cookies(self, file_path="cookies.pkl"):
        pass
 
    def crawl_links(self, keywords, file_path="links.txt"):
        pass
 
    def crawl_page(self, link, file_path="comments.txt"):
        pass

然后,为了简化操作,我们利用 Python 内置的 tkinter 模块编写一个简易的 GUI 界面,也采用类似的架构方式,以便于后续代码的修改。首先,我们要明确这个 GUI 界面的功能。

1. 页面有添加 cookies、删除 cookies(因为 cookies 有时效性)的功能,我给这个功能起名为配置,并将其放在菜单中。

2. 页面有 “帮助” 功能,在其中详细地编写操作流程的文字,可以帮助其他人使用,将该功能放置在菜单中。

3. 页面有选择 cookies(便于我们正确选择未过期的 cookies)、输入关键词、点击开始爬虫的功能,将其显示在主界面上。

4. 为了方便数据的管理,我们将所有数据统一放在一个文件夹下,并详细写出文件夹的组织模式。

 

文件夹结构
jd_data->  goods_name_1 -> links.txt
                        -> comments -> comment1.txt
                                    -> comment2.txt
       ->  goods_name_2
       ->  cookies -> name_1.pkl
                   -> name_2.pkl

 

接下来,就让我们合并上述代码编写这个 GUI 界面吧。

import os
from DrissionPage import ChromiumPage
import time
import pickle
import tkinter as tk
from tkinter import ttk, messagebox, simpledialog
 
 
def get_cookies(file_path="cookies.pkl", platform_url='https://www.jd.com/'):
    page = ChromiumPage()
    page.get(platform_url)
    time.sleep(120)
    cookies = page.cookies()
    with open(file_path, "wb") as cookies_file:
        pickle.dump(cookies, cookies_file)
 
 
class Agent:
    def __init__(self, cookies):
        self.cookies = cookies
        self.platform_url = 'https://www.jd.com/'
 
    def crawl_links(self, keywords, file_path="links.txt"):
        pass
 
    def crawl_page(self, link, file_path="comments.txt"):
        pass
 
 
class App:
    def __init__(self):
        # 设置网页链接
        self.platform_url = 'https://www.jd.com/'
        # 先创建文件夹
        home_directory = os.path.expanduser("~")
        self.jd_data_folder = os.path.join(home_directory, "jd_data")
        if not os.path.exists(self.jd_data_folder):
            os.mkdir(self.jd_data_folder)
        self.cookies_folder = os.path.join(self.jd_data_folder, "cookies")
        if not os.path.exists(self.cookies_folder):
            os.mkdir(self.cookies_folder)
        # 编写界面
        self.root = tk.Tk()
        self.root.geometry("300x200")
        self.root.title("京东爬虫工具")
        self.main_menu = tk.Menu(self.root)
        self.edit_menu = tk.Menu(self.main_menu, tearoff=0)
        self.edit_menu.add_command(label="添加cookies", command=self.add_cookies)
        self.edit_menu.add_command(label="删除cookies", command=self.delete_cookies)
        self.main_menu.add_cascade(label="配置", menu=self.edit_menu)
        self.main_menu.add_command(label="帮助", command=self.view_operations_instruction)
        self.root.config(menu=self.main_menu)
        self.label = tk.Label(self.root, text="选择cookies")
        self.label.pack()
        self.cookies_combobox = ttk.Combobox(self.root)
        self.cookies_combobox.pack()
        self.cookies_combobox["value"] = os.listdir(self.cookies_folder)
        self.keywords_label = tk.Label(self.root, text="关键词")
        self.keywords_label.pack()
        self.keywords_entry = tk.Entry(self.root)
        self.keywords_entry.pack()
        self.start_button = tk.Button(self.root, text="开始爬虫", command=self.start)
        self.start_button.pack()
 
        self.root.mainloop()
 
    def add_cookies(self):
        name = simpledialog.askstring(title="输入", prompt="请输入账户名称")
        if name:
            file_path = os.path.join(self.cookies_folder, f"{name}.pkl")
            try:
                get_cookies(file_path)
                self.cookies_combobox["value"] = os.listdir(self.cookies_folder)
            except:
                messagebox.showerror(title="错误", message="未知错误,请重试!")
            else:
                # 完成之后提示
                messagebox.showinfo(title="提示", message="添加成功!")
 
    def delete_cookies(self):
        def delete():
            selected_value = combobox.get()
            if selected_value:
                os.remove(os.path.join(self.cookies_folder, selected_value))
                messagebox.showinfo(message=f"{selected_value}已经被删除!")
            self.cookies_combobox["value"] = os.listdir(self.cookies_folder)
            combobox["values"] = os.listdir(self.cookies_folder)
 
        window = tk.Toplevel(self.root)
        window.geometry('300x200')
        label = tk.Label(window, text="选中要删除的cookies")
        label.pack()
        combobox = ttk.Combobox(window)
        combobox.pack()
        combobox["values"] = os.listdir(self.cookies_folder)
        button = tk.Button(window, text="删除", command=delete)
        button.pack()
 
    def view_operations_instruction(self):
        pass
 
    def start(self):
        if self.cookies_combobox.get() and self.keywords_entry.get():
            path = os.path.join(self.cookies_folder, self.cookies_combobox.get())
            try:
                with open(path, "rb") as f:
                    cookies = pickle.load(f)
            except:
                messagebox.showerror(title="错误", message="未知错误,请重试!")
            else:
                agent = Agent(cookies)
                try:
                    goods_folder = os.path.join(self.jd_data_folder, self.keywords_entry.get())
                    if not os.path.join(goods_folder):
                        os.mkdir(goods_folder)
                    agent.crawl_links(keywords=self.keywords_entry.get(), file_path=os.path.join(goods_folder, "links"
                                                                                                               ".txt"))
                except:
                    messagebox.showerror(title="错误", message="未知错误,请重试!")
                else:
                    with open(os.path.join(goods_folder, "links.txt"), "r", encoding="utf-8") as f:
                        all_links = [_.rstrip() for _ in f.readlines()]
                    for i in range(len(all_links)):
                        try:
                            agent.crawl_page(link=all_links[i], file_path=os.path.join(goods_folder, f"comments{i+1}.txt"))
                        except:
                            pass
 
 
if __name__ == '__main__':
    App()

这样,我们就写出了一个可扩展的代码架构,在下一篇文章中我将会把 Agent 类的相关代码补全,这里不做赘述。

3. 打包流程

接下来就让我们将刚才做好的程序进行打包吧,我们使用 Pyinstaller 进行打包。

首先,查看导入的所有第三方库是否在 pip list 中能看到,为此,我们打开终端(注意,一定要在开始菜单里找到终端,不能在 pycharm 里的终端中输入,因为那是虚拟环境),输入命令

pip list

得到如下结果:

OK,在 pip list 中找到了 DrissionPage,于是就可以进行下一步操作了。如果在 pip list 中没有找到,那么只需在这个窗口输入命令

pip install DrissionPage

安装 DrissionPage 库,如果速度慢可以指定镜像源,这里不做赘述。直到在 pip list 中能看到 DrissionPage 就算成功了。

接下来,复制自己 python 文件所在的目录,比如我这里 python 文件的路径为 D:\apps \ 京东爬虫工具 \ jd_crawler.py。如果文件在 D 盘(像我这样),那么先在终端输入 D:,显示以下结果

然后输入 cd D:\apps \ 京东爬虫工具 进入文件所在目录,最后输入

pyinstaller -w -F jd_crawler.py

最后看到终端输出一连串的字符

最后一行显示 successfully,成功!

最后就可以在 python 文件所在目录看到一个 dist 文件夹,点击即可查看到打包好的 exe 文件啦。

作者自认才疏学浅,如有不当之处,欢迎各位的批评指正。下一篇文章我会将上面的 Agent 类补充完整,供大家学习交流。

 

获取资源前请仔细阅读一下声明:

重要提示

如有解压密码: 看下载页、看下载页、看下载页。
源码工具资源类具有可复制性: 建议具有一定思考和动手能力的用户购买。
请谨慎考虑: 小白用户和缺乏思考动手能力者不建议赞助。
虚拟商品购买须知: 虚拟类商品,一经打赏赞助,不支持退款。请谅解,谢谢合作!
声明: 本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。