href="primer/index.html"
вместо href="/primer/index.html"
. С вашей точки зрения кажется, что все работает нормально, ошибка незаметна, но бот резолвит такие относительные ссылки из документа /primer2/index.html
в вот такие абсолютные ссылки /primer2/primer/index.html
.так как некоторые ссылки могут быть скриптами или css
//a
выбирет только реальные ссылки на страницы, по которым возможно перейти. куки, может они как-то связаны с логином?
//*[preceding-sibling::div[@class="start"] or self::div[@class="start"]][following-sibling::div[@class="end"] or self::div[@class="end"]]
//*[preceding-sibling::div[@class="start"] and following-sibling::div[@class="end"]]
//div[@class='primer']/p[@class='oposit part1 part2' and text()='Примечание']/following-sibling::div[@class='halfM indPar']/text()
marker
будет правильным словом.section_begin_marker
и section_end_marker
. for post in list_doc.cssselect('.forum-post-table'):
user = post.cssselect('.forum-user-name a')[0]
name = user.text_content()
url = urljoin(URL, user.get('href'))
# title = user_name.get('title')
descr = post.cssselect('.forum-post-text')[0].text_content()
try:
while condition:
yield something
finally:
db.close()
except:
continue
наexcept StandardError:
continue
<script class="code" type="text/javascript">
//<![CDATA[
$(document).ready(function () {
$.jqplot._noToImageButton = true;
var graph = ...
graph
все исходные данные.Accept
и Accept-Language
зависят от User-Agent
. Вы меняете User-Agent, и Гугл может фиксировать это расхождение. Попробуйте для начала вместо getUseragent() задать константную строку. Потом, если вам так нужно менять User-Agent, то посмотрите как это делает Random Agent Spoofer, он согласут все заголовки с фейковым User-Agent, возможно придется лезть в его исходники, поэтому проще с константной строкой.ru-RU
из Accept-Language
. Это не означает, что пропадут русскоязычные результаты в выдаче или будут проблемы с кодировкой. У меня вообще вся система и браузер не локализованы, это не мешает гуглить по-русски.https://www.google.ru/search?q=q&num=100
такие запросы шлют только боты. В браузере при поиске с главной страницы Гугала идет запрос огромной длинны с десятком параметров, в том числе, какие-то уникальные хэши. Попробуйте сначала запросить главную, принять и записать все cookies, выдрать из формы поиска url, по которому уйдет запрос, добавьте туда q=blabla
и посылайте новый запрос со всеми cookie. Кстати, на каждый запрос приходят новые cookie и их бы неплохо использовать в следующем запросе, как бы это происходило в реальном браузере, это увеличит время/количество_запросов до бана.num=100
, вам так проще парсить, а Гуглу так проще банить тех, кто парсит. Уберите этот параметр и выкачивайте SERP по одной странице. Между запросами делайте паузы в несколько секунд как серфил бы живой человек. При этом возможно параллельно работать с другим запросом из другой сессии с другим набором cookies и User-Agent, как будто несколько человек сидят с одного IP из-за NAT. Но, вообще, выборка SERP глубже одной-двух страниц сильно увеличивают подозрение в ваш адрес и приближают капчу, постарайтесь по возможности вообще отказаться от выборки 100 результатов ради того чтобы парсер работал хоть как-то.from urllib.request import urlopen # for Python 3
# from urllib2 import urlopen # for Python 2
from lxml.etree import XMLSyntaxError
from lxml.html import fromstring
from pandas import DataFrame, ExcelWriter
URL = 'http://www.tinko.ru/c-3.html?limit=100&no_cache=true&p=l'
ITEM_PATH = ' .info-block .product-name'
DESCR_PATH = '.breadcrumb .active'
HARET_PATH = '#techdata li'
def parse_courses():
f = urlopen(URL)
list_html = f.read().decode('utf-8')
list_doc = fromstring(list_html)
df = DataFrame(columns=('name', 'description', 'href'))
for elem in list_doc.cssselect(ITEM_PATH):
a = elem.cssselect('a')[0]
href = a.get('href')
name = a.text
details_html = urlopen(href).read().decode('utf-8')
try:
details_doc = fromstring(details_html)
except XMLSyntaxError:
continue
description = details_doc.cssselect(DESCR_PATH)[0].text_content()
haret_elems_list = [('name', name), ('description', description), ('href', href)]
for haret_elems in details_doc.cssselect(HARET_PATH):
spans = haret_elems.cssselect('span')
title = spans[0].text_content()
bower = spans[1].text_content()
haret_elems_list.append((title, bower))
df = df.append(dict(haret_elems_list), ignore_index=True)
writer = ExcelWriter('tinko_ru_price_list.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='tinko.ru price list', header=True, index=False)
writer.save()
def main():
parse_courses()
if __name__ == '__main__':
main()