python抓取动态网页(《网络上常见的GIF动态图》5月份就写好了)
优采云 发布时间: 2021-11-14 09:19python抓取动态网页(《网络上常见的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('