python爬虫总结

    xiaoxiao2024-11-29  65

    python2转成python3的问题:

    使用python3下边的2to3.py

    打开cmd,进到python安装目录下的  \Tools\scripts文件夹中 输入python 2to3.py -w 目标py文件路径/目标.py

    通过这种方式可以将一些格式的区别进行转化。

    import格式的区别:

    py2和py3的import机制不同,详情可以百度。

    比如在A文件夹下有A1.py和A2.py,在py2中,可以直接A1.py导入A2可以直接写成import A2

    在py3中,需要改成from A import A2

    爬虫过程中的问题:

    connect close问题:(如图)

    现象: 自己浏览器可以打开,但是爬虫时一直连接close。网上找了一些方法发现没什么用。

    解决方法:抓取自己浏览器的数据包,将自己的agent放到爬虫的request里即可正常爬取。怀疑是自己选取的agent数据集太老了,导致无法连接。

    此问题只存在于个别网站,原有的agent数据是可以访问大多数网站的。

    网站内容列表每个页面都是同样的url问题:

    情况1: 当翻页时,可以通过抓包来获取到真实的url

    情况2: 通过前端页面可以找到真实的url

    情况3:在无法获取到url时,可以通过web driver得到一个页面,然后通过click下一页等按钮来实现翻页

    比如可以使用xpath来对button进行定位:

    nextPage = driver.find_element_by_xpath("*******") nextPage.click()

    还可以通过执行JavaScript的方式来翻页,比如:

    driver.execute_script("javascript:getBidList('153','-1',{0});".format(j))

    情况4:抓包无法获取到真实的url,但是可以抓取到json格式的数据包,例如:

    { "people": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }, { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"}, { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" } ]}

    前端页面将这些服务器返回的json数据填入到相应的位置从而结合成我们看到的页面。可以将这些数据用get_text()的方法,然后使用正则匹配即可提取出所需的信息。

    正则匹配的问题:

    (.*?)解决不了的问题用(.+$)解决了,迷。

    正则匹配里的?:是非常好用的。

    正则匹配的效果,开始的时候会有很多考虑不到的情况,越往后积累的越多,提取关键词的效果也就越好,感觉还有点机器学习的意思。

    解码格式的问题:

    字符编码的话改成gbk或者utf-8之类的,换着试,应该总能得到合适的。其中夹杂的一些不可见字符,报错的时候直接replace掉就行了。

    soup=BeautifulSoup(html, 'html.parser') content0 = str(soup).replace(u'\xa0', '').replace(u'\xa5', '') contents = soup.get_text() contents1 = contents.encode('gbk', 'ignore') contents = contents1.decode('gbk')

    需要登录的情况,可以找到输入框填充账号和密码,还可以通过cookie登录:

    headers ={ 'Host': '*****', 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0', 'Upgrade-Insecure-Requests': '1', 'User-Agent': '*******', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Cookie': '*******' } response = requests.get(url, headers = headers) soup =BeautifulSoup(response.content, 'html.parser')

    爬取结果的问题:

    存成txt:

    存成txt是很简单的,大致逻辑如下:

    soup=BeautifulSoup(html,'html.parser') conent=soup.find('div', class_='content').get_text() with open ('file.txt','a') as m: m.write(content)

    储存成excel:

    python操作excel需要用到xlrd和xlwt两个模块。例如:

    myxls = xlwt.Workbook() sheet1 = myxls.add_sheet(u'sheet1', cell_overwrite_ok=True) headData = ['姓名', '学号', '班级'] for colnum in range(0, 3): sheet1.write(0, colnum, headData[colnum], xlwt.easyxf('font: bold on')) myxls.save('infomation.xls')

    直接存入数据库:

    还没做

    pdf等附件下载的问题:

    r = getHtml(url) f = open(filename, 'wb') downdown(f, r) def downdown(f,r): block = 8192 while True: buffer = r.read(block) if not buffer: break f.write(buffer) f.close()

    下载附件主要是注意附件的类型,这个在url中应该会有体现,什么类型的文件就储存成什么类型的文件。

    表格问题:

    有些网站的数据是以表格形式来展示的,如果每个网页的格式都是统一的,那么可以写出一个傻瓜式的代码,直接定位抽取有关信息就行了。但是有的网站每个网页的表格格式都是不一样的,因此采取了先遍历tr,再遍历td的方法,通过正则匹配关键词去寻找要提取的内容。

    将表格原始数据保存下来,存成html文件。

    pattern_table = re.compile(r'(<table.*?/table>)', re.S) tbody = re.findall(pattern_table, contents) table = open('%s.html' % name, "w+") print(tbody, file=table) table.close()

    其他问题:

    附件命名问题:字符串中存在/ \ : * " < > | ?符号,文件名中不能有这个符号,所以报错。可用replace函数去掉。

    附件名称可能存在重复,例如当爬取到两个“附件.pdf”时,后边的附件会覆盖掉前边的附件。因此需要改变文件命名的方式,比如使用时间+项目名称的方式等等。

    最新回复(0)