设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 17072|回复: 16
打印 上一主题 下一主题

新人求教,两个正则匹配问题,爬网页不会找内容。。

[复制链接]

1

主题

0

好友

45

积分

新手上路

Rank: 1

跳转到指定楼层
楼主
发表于 2017-8-15 18:14:57 |只看该作者 |正序浏览
本帖最后由 vocaliu 于 2017-8-15 18:25 编辑

刚学,基础基本没有,直接四处看爬虫希望能边玩边学。

1,四处拼代码弄的爬虫爬妹子图网站,虽然现在能用了,但是里面有个正则搞不定,导致实现的很丑。
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Sun Aug 13 00:47:22 2017
  4. @author: vocaliu
  5. @version:Anaconda python3.6
  6. """
  7. import urllib
  8. import urllib.request
  9. import re
  10. import os
  11. from multiprocessing import Pool

  12. def download_page(url):
  13.     head = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36',  
  14.              'Referer': 'http://www.meizitu.com',  
  15.              }                                         #伪装浏览器登陆
  16.     request = urllib.request.Request(url,headers=head) #构建请求
  17.     response = urllib.request.urlopen(request,timeout=10)
  18.     data = response.read()                             #获得服务器响应并读取链接内容(网页、图片或其他)
  19.     return data                                        #返回值就是链接中的具体内容
  20.         
  21. def imgdownload_num(startnum,stopnum):
  22.     for szwz in range(startnum,stopnum):               #这个数字不断变化来抓不同链接
  23.         url = url0 + str(szwz) + '.html'               #合并网址
  24.         os.mkdir('F:\pic\{}'.format(szwz))             #新建与网址一样的文件夹
  25.         wronglink = 0
  26.         try:
  27.             html = download_page(url)                  #在这里做一轮try except,防止遇到错误的抓取页面导致的报错
  28.             regx = r'http://[\S]*\.jpg'                #通过正则配对,得到页面中的jpg图片链接
  29.             pattern = re.compile(regx)                 #re.compile() 可以把正则表达式编译成一个正则表达式对象.
  30.             img_link = re.findall(pattern,repr(html))  #repr()类似str,用处不一样。
  31.         except:
  32.             wronglink += 1
  33.             print('发现第{}个错误的抓取网址'.format(wronglink))#设置时会有一些指向404页面的网址
  34.             break
  35.         num = 1
  36.         wrongpiclink = 0
  37.         for img in img_link:
  38.             try:
  39.                 image = download_page(img)             #将每个img_link链接中的图片都读取出来,并保存成下面的本地链接
  40.                 if len(image) > 45000:                 #大小不到45k的图跳过
  41.                     with open('F:\pic\{}\{}.jpg'.format(szwz,num),'wb') as fp:
  42.                         fp.write(image)
  43.                         print('pic{}-{} downloaded'.format(szwz,num))
  44.                         num += 1
  45.                 else:
  46.                     continue
  47.             except:
  48.                 wrongpiclink += 1
  49.                 print('发现第{}个错误的图片链接'.format(wrongpiclink))#源文件里有一些指向404页面的图片
  50.     return

  51. url0 = 'http://www.meizitu.com/a/'
  52. #开始多进程爬
  53. if __name__ == '__main__':
  54.     print('Parent process %s.' % os.getpid())
  55.     p = Pool(8)
  56.     for i in range(8):
  57.         p.apply_async(imgdownload_num, args=(i*8+1,i*8+9))
  58.     p.close()
  59.     p.join()
  60.     print('All subprocesses done.')
复制代码
正则匹配那儿忘了抄的谁的了,抓的是图里所有的jpg文件,然后只能自己再加个len()>45k来删掉文件大小较小的缩略图。
  1. regx = r'http://[\S]*\.jpg'
复制代码
实际上网站的图是两种,

  1. 无效缩略图      src="http://mm.howkuai.com/wp-content/uploads/2017a/05/08/limg.jpg" alt
  2. 需要抓的图  src="http://mm.howkuai.com/wp-content/uploads/2017a/06/13/01.jpg" />

复制代码
感觉本该很简单,但是我真不会写。。。

2,爬另一个网页,要抓文字内容不会抓,目标是抓文字然后整理数据库分析,在这个过程中熟悉python的操作。不过代码完成度几乎为0就不贴了。
网页上要抓的内容在一个table里,希望能抓到张三丰这三个字,所有的网页对应位置的标签内容都是一样的,感觉应该也好写,但是不会。。。

  1. 姓&nbsp;&nbsp;&nbsp; 名:</font></td><td height="26" width="757"><font size="4" color="#000080">&nbsp;张三丰              </font></td></tr>
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

17#
发表于 2017-8-25 09:32:13 |只看该作者
feifeiwuda 发表于 2017-8-24 18:06
请问要爬取的网站的head如何得到?

你用 requests 库来请求,拿header很容易
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

16#
发表于 2017-8-25 09:31:49 |只看该作者
feifeiwuda 发表于 2017-8-24 17:51
我把后面多线程的代码删除了,那怎么办?

那就手动调用  imgdownload_num(i*8+1,i*8+9)
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

154

积分

注册会员

Rank: 2

15#
发表于 2017-8-25 09:31:44 |只看该作者
feifeiwuda 发表于 2017-8-24 18:06
请问要爬取的网站的head如何得到?

请参考这篇文章
https://my.oschina.net/june6502/blog/224062
回复

使用道具 举报

0

主题

0

好友

18

积分

新手上路

Rank: 1

14#
发表于 2017-8-24 18:06:16 |只看该作者
请问要爬取的网站的head如何得到?
回复

使用道具 举报

0

主题

0

好友

18

积分

新手上路

Rank: 1

13#
发表于 2017-8-24 17:51:48 |只看该作者
本帖最后由 feifeiwuda 于 2017-8-24 18:04 编辑
crossin先生 发表于 2017-8-24 17:27
他通过创建线程来调用的


我把后面多线程的代码删除了,那怎么办?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

12#
发表于 2017-8-24 17:27:18 |只看该作者
feifeiwuda 发表于 2017-8-24 13:45
请问楼主,你使用循环来更新网址的时候,for szwz in range(startnum, stopnum): 这句话中的startnum, st ...
他通过创建线程来调用的
  1. p.apply_async(imgdownload_num, args=(i*8+1,i*8+9))
复制代码
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

18

积分

新手上路

Rank: 1

11#
发表于 2017-8-24 13:45:09 |只看该作者
vocaliu 发表于 2017-8-20 13:54
这个是我的第一个练手程序,每个功能实现都是百度之后抄一两行代码再改的,虽然能用但是小毛病很多。

1 ...

请问楼主,你使用循环来更新网址的时候,for szwz in range(startnum, stopnum): 这句话中的startnum, stopnum这两个参数在哪里指定的??
回复

使用道具 举报

1

主题

0

好友

45

积分

新手上路

Rank: 1

10#
发表于 2017-8-20 13:54:43 |只看该作者
feifeiwuda 发表于 2017-8-20 11:48
请教楼主,我按你的代码在pycharm中运行了一遍,怎么什么都没有啊??也没有在f盘下有新建的pic文件夹。。 ...

这个是我的第一个练手程序,每个功能实现都是百度之后抄一两行代码再改的,虽然能用但是小毛病很多。

1, 我用的mkdir,所以你得先自己建一个f:/pic 文件夹,否则你换成makedirs才能自动生成pic文件夹

2, 你把54行以后的删掉,直接写一行
imgdownload_num(1, 3)
看看会报什么错吧

3, 实际测试发现,这个网站现在卡的要死,我现在下载有的也下不下来。需要把request里的timeout设高一点,否则有时候明明有图片也报错。
回复

使用道具 举报

1

主题

0

好友

45

积分

新手上路

Rank: 1

9#
发表于 2017-8-20 13:40:26 |只看该作者
那个代码是四处拼的,多进程部分的代码可能把前面所有的报错都吃掉了。
你把54行以后的删掉,直接写一行
imgdownload_num(1, 3)
看看会报什么错吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-23 08:34 , Processed in 0.017528 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部