python抓取动态网页(《网络上常见的GIF动态图》5月份就写好了)

优采云 发布时间: 2021-11-14 09:19

  python抓取动态网页(《网络上常见的GIF动态图》5月份就写好了)

  前面写的字~

  好久没写爬虫相关的文章了。今天抽时间分享一个我之前做的程序。

  经常逛A站和B站的人,对一个节目《网上常见的GIF动图》并不陌生

  今天就来分享一下,如何通过爬虫自动将这些动作采集到你的电脑中(其实这个程序是5月份写的,一直拖到想起来分享)。

  一. 思路分析

  根据爬虫的基本规律:

  1.找到目标

  2.获取目标

  3.处理目标内容,获取有用信息

  1.首先,我们的目标是:找到一个动图,去GIFFCC.COM

  

  这个网站是论坛式的网站,分为几类,反正各种*敏*感*词*试试。

  我们的目标是找到这些(采集)(隐藏)动作(到)图片(自我)的(自我)(电)地址(大脑)。

  2.看各个模块的网址,看看是什么规则

  '#39;,#各种GIF动态图片的其他来源

  '#39;,#美女GIF动图源码

  '#39;,#Sci-Fi 奇幻电影 GIF *敏*感*词*源

  '#39;,#Comedy 搞笑电影 GIF *敏*感*词*源

  '#39;,#动作冒险电影 GIF *敏*感*词*源

  '#39;#GIF 恐怖惊悚电影的*敏*感*词*来源

  是的,没错,如果你是游客参观的话,那么每个版块的网址都是这样的——1.html

  那么每个模块的内容规律是什么?直接上图:

  

  我们关心的是当前页面的URL和页数。跳转到第二页后,地址变为:

  换句话说,URL 的法则是

  这里注意网站的图片是动态加载的。只有当你向下滑动时,下面的图片才会逐渐出现。请暂时写下来。

  3.每个GIF所在页面的规律

  

  其实这不是一个规律,但是只要找到单张图片的地址,就没有什么难处理的了。

  两个动手

  

  1.获取入口页面的内容

  即根据传入的URL,获取整个页面的源码

   #仅仅获取页面内容

def get_html_Pages(self,url):

try:

#browser = webdriver.PhantomJS(executable_path=r'C:\Python27\Scripts\phantomjs.exe')

browser = webdriver.PhantomJS()

browser.get(url)

html = browser.execute_script("return document.documentElement.outerHTML")

browser.close()

html=HTMLParser.HTMLParser().unescape(html).decode('utf-8')

return html

#捕捉异常,防止程序直接死掉

except Exception,e:

print u"连接失败,错误原因",e

return None

  这里我们使用了 webdriver 和 PhantomJS 模块,为什么?因为网页是动态加载的,所以这种方式可以爬取的数据是满满的。

  那么还有一个问题,为什么没有滑动,得到的数据

  2.获取页码

   #获取页码

def get_page_num(self,html):

doc = pq(html)

print u'开始获取总页码'

#print doc('head')('title').text()#获取当前title

try:

#如果当前页面太多,超过8页以上,就使用另一种方式获取页码

if doc('div[class="pg"]')('[class="last"]'):

num_content= doc('div[class="pg"]')('[class="last"]').attr('href')

print num_content.split('-')[1].split('.')[0]

return num_content.split('-')[1].split('.')[0]

else:

num_content= doc('div[class="pg"]')('span')

return filter(str.isdigit,str(num_content.text()))[0]

#如果获取页码失败,那么就返回1, 即值获取1页内容

except Exception,e:

print u'获取页码失败'.e

return '1'

  这里的页码处理使用了一个模块pq,即PyQuery

  从 pyquery 导入 PyQuery 作为 pq

  使用PyQuery查找我们需要的元素,感觉更好处理,很方便

  同时,这里的处理有点意思。如果你观察这个页面,你会发现每个模块的页码在顶部和底部都有一个。然后我在这里剪掉它,因为我们只需要一个页码。

  3-6 步骤 3 到 6 一起

  其实就是按照页数来遍历,得到每一页的内容

  然后获取每个页面的所有图片地址

   print u'总共有 %d页内容' % int(page_num)

#3.遍历每一页的内容

for num in range(1,int(page_num)):

#4.组装新的url

new_url = self.url.replace( self.url.split('-')[2],(str(num)+'.html') )

print u'即将获取的页面是:',new_url

#5.加载每一页内容,获取gif list 的内容

items=self.parse_items_by_html(self.get_all_page(new_url))

print u'在第%d页,找到了%d 个图片内容' % (num,len(items))

#6.处理每一个元素的内容

self.get_items_url(items,num)

  在获取每个页面的内容时,需要重新组合页面地址。

  #4.组装新的url

new_url = self.url.replace( self.url.split('-')[2],(str(num)+'.html') )

print u'即将获取的页面是:',new_url

  有了新地址,就可以获取当前页面的内容,进行数据处理,得到每张图片的地址列表

  #5.加载每一页内容,获取gif list 的内容

items=self.parse_items_by_html(self.get_all_page(new_url))

print u'在第%d页,找到了%d 个图片内容' % (num,len(items))

   #解析页面内容,获取gif的图片list

def parse_items_by_html(self, html):

doc = pq(html)

print u'开始查找内容msg'

return doc('div[class="c cl"]')

  得到图片列表后,再次解析得到每张图片的URL

  #解析gif 的list ,处理每一个gif内容

def get_items_url(self,items,num):

i=1

for article in items.items():

print u'开始处理数据(%d/%d)' % (i, len(items))

#print article

self.get_single_item(article,i,num)

i +=1

#处理单个gif内容,获取其地址,gif 最终地址

def get_single_item(self,article,num,page_num):

gif_dict={}

#每个页面的地址

gif_url= 'http://gifcc.com/'+article('a').attr('href')

#每个页面的标题

gif_title= article('a').attr('title')

#每张图的具体地址

#html=self.get_html_Pages(gif_url)

#gif_final_url=self.get_final_gif_url(html)

gif_dict['num']=num

gif_dict['page_num']=page_num

gif_dict['gif_url']=gif_url

gif_dict['gif_title']=gif_title

self.gif_list.append(gif_dict)

data=u'第'+str(page_num)+'页|\t'+str(num)+'|\t'+gif_title+'|\t'+gif_url+'\n'

self.file_flag.write(data)

  在这里,整合数据,为将数据写入数据库做准备

  7.将图片保存到本地并将数据写入数据库

<p>#使用urllib2来获取图片最终地址

def get_final_gif_url_use_urllib2(self,url):

try:

html= urllib2.urlopen(url).read()

gif_pattern=re.compile(&#39;

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线