爬虫常见错误以及难点(一)

2023-05-16

目录

常见错误一

常见错误二

常见错误三

常见错误四

难点:

难点一

难点二

难点三

难点四

难点五

难点六

难点七

难点八

难点九

难点十

难点十一

难点十二

难点十三

难点十四

难点十五

难点十六


常见错误一


就是设置 headers错误 就是 :这个两边是不可以出现空格的  

常见错误二


如果发现网页爬取的内容 爬取不到
应该就是 有反扒机制触发  或者是 自己的语法写错了  

常见错误三


listerrow 就是列表出错  就可以参考 14微博热搜 里面的 if判断语句 就是解决列表出错的  

常见错误四


UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 339: invalid continuation byte
这个是遇到了 反扒


一般来说 出现这个错误 content = req.content.decode('utf-8')在这个里面加上参数content = req.content.decode('utf-8','ignore')也就是忽略报错  

难点:

难点一


POST 使用 data  get 使用 params
kw: 这个就是相当于  网站内部自己 怎么搜所东西  所以建立字典 去模仿 网站搜索的过程\

s = input("请输入你想要翻译的单词:")

dat = {
    'kw': s
}
记得去网站中寻找
param = {
 'type': '24',
 'interval_id': '100:90',
 'action': '',
 'start': 0,
 'limit': 20,
}
这个也是 网站中的东西
要用到字典 2种情况  f12的标头 一直往下拉  英文是 form data 中文是表单数据  有时候 不在标头  有时候在 Payload中去找  

难点二


# Python3.7及以上 必须加上http://,不加就会报错 就是字典里面
dlip = {
    'http':'http://47.100.9.91:7890'
}  

难点三


open函数用法
with open("第一次作业.html",mode='w',encoding='utf-8')as f:
    f.write(content)  

难点四


join函数
这个 comment = ''.join(comment) 表达的意思是 爬取的网页有 9个p标签 存储到列表中 就有9个列表
但是我想要 合并这些列表 输出成一整个文字 这样方便提取数据 所以使用join函数  ''这个就是表示 合并的时候 ''有什么符号 空的就表示 不要符号  

难点五


遇到 utf-8 或 gbk解码问题 实在不知道是什么的时候 用 html = url.text 就是 猜是什么解码 只要返回页面就可以 因为我们需要的是 a标签的值   两种方法都可以用 一个不行 用另外一个
或者 使用一个直接解决的方法 就是  加上一个参数 ignore html = url.content.decode('gbk','ignore')
first_url = 'https://www.dytt8.net'
这个是先设置一个 头 也就是要拼接的 url
getas = []
for a in biggerurls:
    url = requests.get(url=a,headers=headers)
    html = url.content.decode('gbk')
    urls = etree.HTML(html)
    geta = urls.xpath('//b/a/@href')
    # 因为这里得到的 a标签的 url是不完整的url 也就是/html/gndy/jddy/list_63_{}.html 这样子的
    # 那么 就需要 拼接 url的值
    # 使用 map函数拼接
    getass = list(map(lambda a:first_url+a,geta))
    # 这个语法就是 map(lambda 命名:要拼接的url+要拼接的url,返回给geta)
    # 这样拿出的 只是一个map内存 还要给函数加一个 list(map(lambda a:first_url+a,geta))
    getas.append(getass  

难点六


这里获取的时候  注意 在网页寻找的时候 先找到图片对应的链接 然后 用正则表达式 寻找 但是如果一直找不到 语法也没错 那么就进入源码去寻找

通过ctrl+f 打开查找 然后复制 图片的链接去找 找到源码中存储链接的东西 在用正则表达式去写)

获取图片的数据是用bytes流数据  get.content  

难点七


divs = soup.find_all('div')[1:]
for div in divs:
    # 这里要加一个list  记住 以后获取东西的时候 看到结果是这样一个对象<generator object PageElement.stripped_strings at 0x00000233A90EA730> 就是说明要加List
    z = list(div.stripped_strings)
    print(z)  

难点八


编码方式 打开f12 进入header头部去寻找  编码方式  

难点九


当发现 需要使用|隔开的时候 可以使用  join函数
getactors = '|'.join(getactor)  

难点十


这里使用正则表达式 去掉等等要命名的 alt中的一些特殊符号
alt = re.sub(r',。?\|\*', '', alts)
因为有的alt是没有 名字的 所以使用 len函数
if len(alt) == 0:
    alt = i
    i += 1
img_name = str(alt) + suffix
这里str的原因是  数字 没办法 与字符串拼接 所以选择使用 str将 数字强制转换成 字符串 然后和suffix拼接


这个i=0 然后用 len来表示 图片名称的方法只适用于单线程爬虫 多线程爬虫的话 还是会重复的

img_name = str(alt) + suffix.replace('.null', '.jpg')
这个replace 就是有的图片后缀是null 所以将它替换为jpg  

难点十一


如果说 怕多线程爬取图片重复 那就拿 部分的url来 当作图片的名字就好了
if len(alt) == 0:
    alt = imgurl[-10:-5]
    那就拿图片的url 的部分 来命名这个图片
这个[-10:-5] 就是倒数 后面的值的意思
  

难点十二


切记 切记 切记   这个多线程爬虫 爬取的东西 一定要多  才会运行  不然 根本不会运行 !!!!
所以 如果 range 是(1,4)的话  根本不会运行
for i in range(1, 101):
    url = 'https://www.pkdoutu.com/photo/list/?page={}'.format(i)
    page_queue.put(url)  

难点十三


print(result.status_code) 这个是打印状态码  

难点十四


这个num就是将上面数据的 adminID 拿出来 因为这个人使用adminID 来表示的 也就是相当于分析接口
这个 i.get 就是将上面的字典datas中 叫unknown2的数据拿出来
num = i.get('unknown2')  

难点十五


poem = re.findall('<div\sclass="contson".*?>(.*?)</div>', content, re.DOTALL)
首先就是 在获取 古诗的时候 直接获取整个div 确实可以获取的到全部 但是里面本身就有<p>标签这种 还有\n这种东西
么就可以通过以下这种方法 进行解决
poemss = []
for poems in poem:
    new_poem = re.sub('<.*?>', '', poems)
    # 这个的意思就是 将 <里面无论是什么> 也就是说把所有的标签 全部去除 替换成 空白
    new_poems = new_poem.strip()
    # 这个的意思就是 去除空格  也就是 \n
    poemss.append(new_poems)  

难点十六


因为拿出来的 job_requests 是要合成 整体的 就用strip() 来进行消除空格 然后 使用join进行拼接
这个办法是一个常见的整合办法
    for i in job_requests:
        a = i.strip('/')
        job_request.append(a)
    job_request = ''.join(job_request)  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫常见错误以及难点(一) 的相关文章

随机推荐