找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3808|回复: 7

[求助] 我刚学的爬虫,在保存到文件过程中遇到了问题。

1

主题

5

帖子

5

积分

贫民

积分
5
asd5412487 发表于 2017-12-7 22:32:59 | 显示全部楼层 |阅读模式
本帖最后由 asd5412487 于 2017-12-7 22:34 编辑
  1. from bs4 import BeautifulSoup
  2. import requests
  3. import time
  4. import urllib
  5. url = 'http://www.chinaseed114.com/seed/pzdq/'
  6. r = requests.get(url)
  7. r.encoding = r.apparent_encoding
  8. soup = BeautifulSoup(r.text,'lxml')
  9. def get_url(url):
  10.      url1=[]
  11.      urls=soup.select('tr > td > a')
  12.      for url in urls:
  13.          url1.append(url.get('href'))
  14.      return url1
  15. def get_single_url(url):
  16.      c=[]
  17.      urls =[str(url)+'{}.html'.format(str(i)) for i in range(1,80,1)]
  18.      for single_url in urls:
  19.          c.extend(get_detail_name(single_url))
  20.      return c     
  21. def get_detail_name(url):
  22.      try:
  23.          a=[]
  24.          r = requests.get(url,timeout=8)
  25.          r.encoding = r.apparent_encoding
  26.          soup = BeautifulSoup(r.text,'lxml')
  27.          if 'miaomu' in url:
  28.              return(get_miaomu_name(url))
  29.          else:
  30.              names=soup.select('tr > td > ul > li.t_c > a.px14')
  31.              for name in names:
  32.                  a.append(name.get_text())
  33.              return a
  34.       
  35.      except:
  36.          pass
  37.       
  38. def get_miaomu_name(url):
  39.      b=[]
  40.      r = requests.get(url)
  41.      r.encoding = r.apparent_encoding
  42.      soup = BeautifulSoup(r.text,'lxml')
  43.      names1=soup.select('ul > li.catlist_li > a')
  44.      for name1 in names1:
  45.          b.append(name1.get_text())
  46.      return b     
  47. def get_item_info(url):
  48.      names=soup.select('tr > td > a')
  49.      urls=get_url(url)
  50.      for name,url1 in zip(names,urls):
  51.          r = requests.get(url1)
  52.          r.encoding = r.apparent_encoding
  53.          soup1 = BeautifulSoup(r.text,'lxml')
  54.          data={
  55.              '品种':name.get_text(),
  56.              '详细':get_single_url(url1)
  57.              }
  58.          with open("test.txt",'a+') as f:
  59.              f.write('品种:{}\t详细:{}\n'.format(data['品种'],data['详细']))             #把data的内容弄到一个文件里
  60. get_item_info(url)
复制代码
代码的模块是没有错的,主要问题是后面的文件保存那里。
出现的错误是:UnicodeEncodeError: 'gbk' codec can't encode character '\ufffd' in position 1501: illegal multibyte sequence
我有看不懂错误的原因。也不懂该如何修改。
请大神们指教。
回复

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-12-8 10:18:19 | 显示全部楼层
你爬去的数据里有脏数据例如下面
data['详细'][168]  # '\ufffd\ufffd丰339'
如果不想报错脏数据可以这样
for i in data['详细']
    try:
        f.write(i)#示例写入,具体写入格式自调
    except:
        pass

如果想保存'\ufffd\ufffd丰339'中的'丰339'
for i in data['详细']
    for j in i:
        if j < '\ufffd':    # 如果报出错误写入'\ufffc' 则把比较改为j < '\ufffc'
            f.write(i)#示例写入,具体写入格式自调








回复 支持 反对

使用道具 举报

1

主题

5

帖子

5

积分

贫民

积分
5
asd5412487  楼主| 发表于 2017-12-8 15:39:20 | 显示全部楼层
剑心无痕 发表于 2017-12-8 10:18
你爬去的数据里有脏数据例如下面
data['详细'][168]  # '\ufffd\ufffd丰339'
如果不想报错脏数据可以这样

我试了下第二种方法,获得了13G的内容,不过全都是重复的,而且似乎都是我要爬的第一页的内容,并且爬了13G后出现了错误UnicodeEncodeError: 'gbk' codec can't encode character '\u30fb' in position 103: illegal multibyte sequence
回复 支持 反对

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-12-8 15:51:13 | 显示全部楼层
asd5412487 发表于 2017-12-8 15:39
我试了下第二种方法,获得了13G的内容,不过全都是重复的,而且似乎都是我要爬的第一页的内容,并且爬了1 ...

for i in data['详细']
    for j in i:
        try: # 暴力写入,能写的字符就写,写不了的就跳过
            f.write(j)#示例写入,具体写入格式自调
        except:
            pass
回复 支持 反对

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-12-8 15:53:15 | 显示全部楼层
asd5412487 发表于 2017-12-8 15:39
我试了下第二种方法,获得了13G的内容,不过全都是重复的,而且似乎都是我要爬的第一页的内容,并且爬了1 ...

在requests.get(url)之前把url打印出来,看看是不是每次获取的都是同个url,调试一下
回复 支持 反对

使用道具 举报

1

主题

5

帖子

5

积分

贫民

积分
5
asd5412487  楼主| 发表于 2017-12-8 18:26:53 | 显示全部楼层
剑心无痕 发表于 2017-12-8 15:53
在requests.get(url)之前把url打印出来,看看是不是每次获取的都是同个url,调试一下 ...

http://www.chinaseed114.com/seed/yumi/
http://www.chinaseed114.com/seed/xiaomai/
http://www.chinaseed114.com/seed/shuidao/
http://www.chinaseed114.com/seed/mianhua/
http://www.chinaseed114.com/seed/youliao/
http://www.chinaseed114.com/seed/guacai/
Traceback (most recent call last):
  File "D:\Python36\农作物品种.py", line 66, in <module>
    get_item_info(url)
  File "D:\Python36\农作物品种.py", line 57, in get_item_info
    '详细':get_single_url(url1)
  File "D:\Python36\农作物品种.py", line 19, in get_single_url
    c.extend(get_detail_name(single_url))
TypeError: 'NoneType' object is not iterable
这是运行的结果,不过我打开了text,也是跟原来的一样重复的 只是   第一个网站的第一页 的内容。
回复 支持 反对

使用道具 举报

1

主题

5

帖子

5

积分

贫民

积分
5
asd5412487  楼主| 发表于 2017-12-8 19:08:18 | 显示全部楼层
剑心无痕 发表于 2017-12-8 15:53
在requests.get(url)之前把url打印出来,看看是不是每次获取的都是同个url,调试一下 ...

抱歉,是我的代码打错了一个字母,但是内容还是不对,比如小麦的品种,它重复打印了很多次。还有,我在别的论坛上看到有一种方法,就是import codecs,你觉得可不可行?
回复 支持 反对

使用道具 举报

1

主题

5

帖子

5

积分

贫民

积分
5
asd5412487  楼主| 发表于 2017-12-8 19:54:32 | 显示全部楼层
asd5412487 发表于 2017-12-8 18:26
http://www.chinaseed114.com/seed/yumi/
http://www.chinaseed114.com/seed/xiaomai/
http://www.chinas ...

我自己认真研究了一下,做了些改进,能够成功把信息保存下来了。
在后面的保存那里改为:
root = data['品种']
path =root+'.txt'
f=codecs.open(path,'wb',encoding='utf-8')  
f.write('品种:{}\t详细:{}'.format(data['品种'],data['详细']))
f.close()
btw:谢谢你的帮助!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表