安静地做只小爬虫~

起因

自己的电商课要做关于名医主刀的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)

后记

原理掌握了之后又兴致勃勃地换了几个网站
不过这还只是很初级的爬虫了~
等待以后能变得更厉害~

推荐阅读更多精彩内容