
声明:本文中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本次,我们将采用同样的方式爬取某东上的商品评论,并把打包的完整过程以图片形式呈现在下方。我们仍然按照上一篇文章的逻辑来叙述整个流程。
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 类补充完整,供大家学习交流。
重要提示
如有解压密码: 看下载页、看下载页、看下载页。
源码工具资源类具有可复制性: 建议具有一定思考和动手能力的用户购买。
请谨慎考虑: 小白用户和缺乏思考动手能力者不建议赞助。
虚拟商品购买须知: 虚拟类商品,一经打赏赞助,不支持退款。请谅解,谢谢合作!
声明: 本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
