一、确定需求
- 抓取当当详情页上的图书(打开搜索页面,输入出版社,点击按销量排、只看有货)
- 确定抓取元素:(共12个)
ID / 书名 / 原价 / 折扣价 / 作者 / 出版日期 / 出版社 / 总评分 / 总评论数 / 书店名 / ISBN /类型
- 确定url
http://search.dangdang.com/?key=
+ 出版社名 +
&act=input&sort_type=sort_sale_amt_desc&filter=0%7C0%7C1%7C0%7C0%7C0%7C0%7C0%7C0%7C0%7C0%7C0%7C0%7C0%7C&
- 翻页
<li class="next"><a href="/?key=%E6%B9%96%E5%8D%97%E6%96%87%E8%89%BA%E5%87%BA%E7%89%88%E7%A4%BE&act=input&sort_type=sort_sale_amt_desc&filter=0%7C0%7C1%7C0%7C0%7C0%7C0%7C0%7C0%7C0%7C0%7C0%7C0%7C0%7C&page_index=2" title="下一页">下一页</a></li>
二、流程
(一) 创建项目、爬虫
- scrapy startproject name
- scrapy genspider name example.com
(二) 修改 Items
- 建字典,包含12个键
(三) 修改 spider
- 访问url,解析页面,返回数据
注意事项:
- 注意导入Items模块
- 判断是否需要用上Splash
使用Splash方法:
a. 终端输入sudo docker run -p 8050:8050 scrapinghub/splash
b. 用SplashRequest 代替ScrapyRequest
(四) 修改 pipelines
- 存入数据库
(五) 修改 setting
- 修改user-agent
- 开启splash端口
- 连接数据库
- 开启代理
三、问题
(1) 运行爬虫后,数据库出现错误
- 报错
_mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)")
- 原因:mysql.sock默认路径和实际路径不符
解决办法:为文件建立连接
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
继续报错:
无法创建符号链接"mysql.sock": 文件已存在
- 原因:需要强制创建连接符号
- 解决办法:
ln -sf /var/lib/mysql/mysql.sock /tmp/mysql.sock
(2)数据库密码错误
- 报错
_mysql_exceptions.OperationalError: (2059, "Authentication plugin 'caching_sha2_password' cannot be loaded
- 原因:密码机制变化
- 解决办法:修改密码机制
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '0000';
参考:
修改密码机制
解决MySQL8.0报错:Unknown system variable ‘validate_password_policy’
(3) 数据库报错
字符/数字插入都用 %s,而不用%d
参考:Python MySQLdb issues (TypeError: %d format: a number is required, not str)
常用查错指令
清除所有数据:truncate table dd_list;
查看数量:select count(*) from dd_list;
(4)一万多个页面,抓到2000多就停了
- 怀疑:点击“下一页”翻页的方式不行
(验证:将点击“下一页”翻页换成“url拼接”也不行) - 怀疑:出版社一次传多了
(验证:一次抓一个也不行) - 怀疑:访问过于频繁
(验证:开了代理也不行)
(5)抓评论,最后一页解析错误
把 range(1,page+1)改成range(1,page+2),这样就能抓全了