Python

Python requests+gevent+Beautiful

2016-09-01  本文已影响538人  Daemon1993

很久没有写新的内容了,看最近的一篇 都有2/3个半年了 最近又看了一些爬虫文章 还是想深入研究下

目标就是能爬知乎,太可怕了 装逼模式已开启 懵逼ing 66666翻天 喜极而泣

夜深了 就是容易 说废话 铺垫做完了 现在 来讲讲这些东西

  __author__ = 'Daemon1993'

  import gevent
  import requests
  import time
  from bs4 import BeautifulSoup
  from bs4 import SoupStrainer

  SP = 1
  Count=0

  def getHtmlByFind(baseurl, page):
      url = baseurl + str(page)
      r = requests.session()

      html = r.get(url, timeout=5)

#如果状态不正确 这里目的503 暂停时间增大一点
if (html.status_code != 200):
    global SP
    SP += 0.5
    return

#减少内存压力 取出我们需要的那块 不用全部
only_div_tag = SoupStrainer(id="content-left")

# 先拿到这一块
data = BeautifulSoup(html.text, "lxml",parse_only=only_div_tag)

for tag in data.find_all("div", class_="article block untagged mb15"):
    name=tag.find("img").get('alt')
    content=tag.find("div",class_="content").text.strip()
    global Count
    Count+=1
    pass
    # print("\\n 用户:{0} \\n {1}".format(name,content))

#每请求一次 睡眠一下
time.sleep(SP)

  def getHtmlBySelect(baseurl, page):
      url = baseurl + str(page)
      r = requests.session()

html = r.get(url, timeout=5)

if (html.status_code != 200):
    global SP
    SP += 0.5
    return

#减小内存压力
only_div_tag = SoupStrainer(id="content-left")

# 先拿到这一块
data = BeautifulSoup(html.text, "lxml",parse_only=only_div_tag)

for tag in data.select('div[class="article block untagged mb15"]'):
    name=tag.select('img')[0].attrs.get('alt')
    content=tag.select('div[class="content"]')[0].get_text().strip()
    global Count
    Count+=1
    print("\\n 用户:{0} \\n\\n {1}".format(name,content))

#每请求一次 睡眠一下
time.sleep(SP)

def useFind(baseurl):
    start=time.time()
    global  Count
    Count=0
tasks = [gevent.spawn(getHtmlByFind, baseurl, index) for index in range(1, 50)]
gevent.joinall(tasks)

elapsed=time.time()-start
print('getHtmlByFind time {0}  size{1}'.format(elapsed,Count))

def useSelect(baseurl):
start=time.time()
global  Count
Count=0
#gevent.spawn 加入任务方法
tasks = [gevent.spawn(getHtmlBySelect, baseurl, index) for index in range(1, 50)]
#全部加入队列开始 处理 
gevent.joinall(tasks)

elapsed=time.time()-start
print('getHtmlBySelect time {0}  size{1}'.format(elapsed,Count))

  if __name__ == '__main__':
      baseurl = "http://www.qiushibaike.com/8hr/page/"
      #useFind(baseurl)
      useSelect(baseurl)

先分析 网页结构 如何拿到我们想要的 1是每一个 2是有头像地址和名字 3是content内容
如下图 取每个1的 2 3就行


find分析结构图

跟就结构 分析 大题思路
1处是一个列表 ---> find_all("div",class__="className")--List
然后对每个集合中取出 img 和 div[class="content"]的内容 代码如下
for tag in data.find_all("div", class_="article block untagged mb15"):
name = tag.find("img").get('alt')
content = tag.find("div", class_="content").text.strip()

这里要先记住一点 select 每次返回都是list 在你能控制的住的情况下取[0]
同样分析 你会发现其实差不多 只是写法上有些不同 可以仔细看看两者的写法
for tag in data.select('div[class="article block untagged mb15"]'):
name = tag.select('img')[0].attrs.get('alt')
content = tag.select('div[class="content"]')[0].get_text().strip()

上一篇 下一篇

猜你喜欢

热点阅读