起因
自己的电商课要做关于名医主刀的pre
说到pre就难免要各种搜索,然而自己实在太懒
正巧最近学了点爬虫的东西但是不会用,也算实战一下
而且是假期还没什么事情做,那就开动咯
免责声明
自己做爬虫也只是想简单地试试,不仅设置了时间上的暂停(一页三秒),而且在实际使用时也只是爬了三四页。
在百度等部分搜索引擎的robots.txt文件中禁止或了爬虫行为,代码中不透露相关信息(当然如果想找怎么也能找到)
如出现任何侵权行为与本文作者无关,特此声明
拟定需求
- 手动输入所想要寻找的关键字和所要寻找的页数
- 获取搜索引擎对关键词的搜索页面
- 通过页面抓取链接文字,链接和详细信息
- 到处到data目录下的关键字同名文本文件中
1.0版本
最开始爬虫没想包括封装啊函数啊那么多,就是想单纯地实现它
网上介绍爬虫的blog太多了,重点介绍下愚蠢的某翠踩过的坑
import requests
from bs4 import BeautifulSoup
import os
- 所使用的库
创建输出文件
if not os.path.exists('data'):
os.mkdir('data')
filename='data\\data.txt'
fp = open(filename, 'wb')
if not fp:
print('文件打开失败')
- 相对路径和绝对路径
- 最开始为了简单使用了绝对路径,后发现不具有可移植性
- 相对路径:以.py文件所在目录为根目录
- if not: 最开始pycharm一直提醒我可以改进,最后才发现
- 'wb'模式:二进制写模式,导致了之后的很多byte-str转换
- 用二进制写可以避免很多转码问题闹心
- 但是同时要注意把相应str用合适转码方式转成byte
实现寻找和输出
n = 0 #总获取条数
while(n < 80):
r = requests.get('//某地址//')
soup = BeautifulSoup(r.text, 'lxml')
n += 20 #20条一页
#以下内容因网站不同而不同
for item in soup.findAll("div", {"class": "result"}):
a_click = item.find('a')
#标题
if a_click:
fp.write(a_click.get_text().encode('utf-8'))
fp.write(b'#')
#链接
if a_click:
fp.write(a_click.get("href").encode('utf-8'))
fp.write(b'#')
#摘要
c_abstract=item.find("div", {"class": "c-summary c-row "})
if c_abstract:
strtmp=c_abstract.get_text()
fp.write(strtmp.encode('utf-8'))
#带图片的摘要
else:
c_abstract=item.find("div", {"c-span18 c-span-last"})
strtmp=c_abstract.get_text()
fp.write(strtmp.encode('utf-8'))
fp.write(b'#')
fp.write('\r\n'.encode('utf-8'))
fp.close()
- 通过requests.get拿到搜索引擎对地址的回复
- 通过BeautifulSoup库解析
- 在Chrome上用F12拿到标题,链接,摘要的特征
- 通过encode将str转换成二进制编码写入文件
- 很神奇的是只有加'\r\n'时才能成功换行,单独不可
2.0版本
原版本缺点
- 不能自定义搜索词和页数
- 封装不明显,可重复利用性不高
- 没有时间停顿,不厚道
- 一点提示都没有
import requests
from bs4 import BeautifulSoup
import time
import os
- 所使用的库
get_result(key_words, pagenum)函数
def get_result(key_words, pagenum):
headers = {'User-Agent' : //某 user agent//}
url = (//某//+ key_words +//链//+ str(pagenum * 20) + //接//)
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
return soup
- headers:如果想伪装成自己现在用的浏览器可以google:what is my user agent
- 大部分还是原来的配方和熟悉的味道
deal_data(key_words, pagenum)函数
def deal_news(key_words, pagenum):
if not os.path.exists('data'):
os.mkdir('data')
filename = 'data\\' + key_words + '.txt'
fp = open(filename, 'wb')
if not fp:
print('文件打开失败')
n = 0
while(n < pagenum):
print("working...(page " + str(n+1) + "/" + str(pagenum) + ")")
soup = get_result(key_words, n)
n += 1
#获取部分同上
time.sleep(3)
fp.close()
print("success!")
- 可以看到其实也没啥改进
- 可是就是看着顺眼了很多
测试函数
if __name__ == "__main__":
keywords = input("You keywords?")
while True:
try:
num = input("How many pages do you want? ")
num = int(num)
break
except ValueError:
print('Please input an *integer*')
deal_data(keywords, num)
后记
原理掌握了之后又兴致勃勃地换了几个网站
不过这还只是很初级的爬虫了~
等待以后能变得更厉害~
网友评论