Skip to content

Comments

code refactor#91

Merged
dataabc merged 1 commit intodataabc:multi-filefrom
songzy12:master
Nov 11, 2019
Merged

code refactor#91
dataabc merged 1 commit intodataabc:multi-filefrom
songzy12:master

Conversation

@songzy12
Copy link
Collaborator

代码重构:将该爬虫的各个模块进行了解耦拆分。

  • config.json: 配置相关文件。
  • spider.py: 爬虫逻辑主文件。
  • printer.py: 打印调试信息相关。
  • writer.py: 保存至本地文件或数据库相关。
  • validator.py: 配置参数验证相关。
  • html_parser.py: 网页解析相关。
  • downloader.py: 图片、视频下载相关。

使条理更加清晰,也方便其余开发者对不同模块贡献代码。

运行:

python spider.py

@dataabc dataabc changed the base branch from master to multi-file November 11, 2019 12:40
@dataabc dataabc merged commit a30545a into dataabc:multi-file Nov 11, 2019
@dataabc
Copy link
Owner

dataabc commented Nov 11, 2019

感谢代码提交。

修改后的代码确实比之前更清晰。之前代码都写到一个文件里,确实有些臃肿。也想过按代码功能分成几个文件重构,只是因为两个原因一直没有重构:一是单个文件可能使用更简单,使用者只需要修改一个文件就够了;二是一点小心思,即同样的功能,大家可能更喜欢简单的代码,单文件看起来比多个文件要简单一点,虽然二者代码差不多。

重构后的代码确实更清晰,更易读,更容易二次开发。作了一些测试,发现还有一些问题:

  • python2运行会报错,主要是编码问题,python3没问题;
  • csv结果文件中字段和内容不一致,比如'微博视频url'对应的内容却是发布时间,等等;
  • 写入文件mode互斥,即.txt、.csv和数据库只能写入一种,无法做到写入多种类型。

重构后的代码结构清晰,只是还有需要完善的地方,因此我创建了multi-file分支,将本次提交merge到了该分支上。

多文件的版本虽然有一些小问题,但是整体格局非常好,也给了我很多启发,是一个非常不错的参考。再次感谢对本程序的重构

@songzy12
Copy link
Collaborator Author

感谢作者的及时反馈。

关于提到的问题:

  1. python2 运行报错。
    修改确实是面向 python3 进行的,这点忘记在提交里进行说明。
    python2 还有一个月左右官方就要停止维护了,具体见:https://pythonclock.org/

  2. csv 字段和内容不一致

  3. 写入文件 mode 互斥
    以上两点会在下一个 pull request 修复,可能要过几天。

感谢作者的爬虫代码,也让我学到很多。

@songzy12
Copy link
Collaborator Author

songzy12 commented Nov 12, 2019

关于 2 提到的 csv 字段对应问题在现存代码中也存在。

具体是因为
https://github.com/dataabc/weiboSpider/blob/master/weiboSpider.py#L629

            result_data = [w.values() for w in self.weibo][wrote_num:]

这一行里 w.values() 是不能保证顺序的。
可以参考以下知乎问答:

关于 Python 字典的 values() 方法返回值的顺序? - 廖雪峰的回答 - 知乎
https://www.zhihu.com/question/65855807/answer/235504257

会在下一个 pull request 修复。

@dataabc
Copy link
Owner

dataabc commented Nov 13, 2019

感谢反馈。

这个问题在现存代码中应该是没有的。我以前遇到过这个问题,因为python2的dict值是无序的,部分python3版本也是无序的,导致csv内容错位,为了保证所有python版本正确运行,我后来换成了OrderedDict,
https://github.com/dataabc/weiboSpider/blob/master/weiboSpider.py#L515
这个是有序的,可以保证内容按预期结果保存。

现存代码中可能还存在其它我没发现的问题,欢迎反馈,再次感谢

@dataabc
Copy link
Owner

dataabc commented Nov 13, 2019

我找到csv错位的原因了。

https://github.com/dataabc/weiboSpider/blob/multi-file/html_parser.py#L292
multi-file版的代码中也用了OrderedDict,是有序的。只不过在构建weibo时,图片url、视频url等被放到了最后赋值,所以它们在序列中的位置也靠后,导致乱序。按照
https://github.com/dataabc/weiboSpider/blob/multi-file/writer.py#L85
属性名调整下它们在构建weibo时的顺序就可以了

@songzy12
Copy link
Collaborator Author

啊有道理。

我当时为了把图片和视频相关的隔离出来就都调整到了最后面,结果忘了调整 headers 的顺序。
而 txt 的顺序没有乱是因为那部分用 key 进行了显式的取值。

多谢 debug.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants